The idea is to have all components registered beforehand, then let the
ihandlerselector choose the right ones in resolve time based on some
transient context

Sent from my Red Lumia 920 From: Tomek Pluskiewicz
Sent: 1/3/2013 5:40 AM
To: Castle Project Users
Subject: Re: Resolving components dynamically based on name
Thanks

I have already seen IHandlersSelector. After I have chosen a handler
how can I inject the dependencies extracted from the requested
component name? I tried to return a fresh instance of IHandler but I
had problems with initializing it properly. First I needed
IKernelInternal. Having supplied it then it seems that ComponentModel
is incomplete and has no constructors. This one I'm not sure how to
populate.

I did however managed to implement a IHandlersSelector in a hackish
way. When a recognized component key is requested I parse it to
extract the dependency values and register a new component with
IKernel. The gotcha is that a check must be made to ensure that
registration hasn't been made already. Otherwise
StackOverflowException is thrown.

Is this a terrible usage or is that the only way to dynamically
register components at resolve-time?

Regards,
Tom

On 2 Sty, 17:18, Patrick Steele <[email protected]> wrote:
> I think a Handler Selector would work in this case:
>
> http://docs.castleproject.org/Windsor.Handler-Selectors.ashx
>
> ---
> Patrick Steelehttp://weblogs.asp.net/psteele
>
> On Wed, Jan 2, 2013 at 10:43 AM, Tomek Pluskiewicz <[email protected]>wrote:
>
>
>
>
>
>
>
> > Hi
>
> > Yes there is only one implementation but it is used as a dependency and
> > configured to be resolved by name. The reader is configured in code
>
> > Component.For<ICsvReader>()
> > .ImplementedBy<CommaSeparetedCsvReader>()
> > .DependsOn(new { SkipHeader = true, HeaderRowsToSkip = 2 } )
> > .Named("CommaSeparetedCsvReader_Skips2Rows")
> > .Lifestyle.Transient
>
> > Component.For<ICsvReader>()
> > .ImplementedBy<CommaSeparetedCsvReader>()
> > .DependsOn(new { SkipHeader = true, HeaderRowsToSkip = 1 } )
> > .Named("CommaSeparetedCsvReader_Skips1Row")
> > .Lifestyle.Transient
>
> > Component.For<ICsvReader>()
> > .ImplementedBy<CommaSeparetedCsvReader>()
> > .Named("CommaSeparetedCsvReader")
> > .Lifestyle.Transient
>
> > These are used as dependency in a processor class. It is configured in
> > XML, so that in can be manipulated at runtime
>
> > <component id="Processor
> >    type="Processor">
> >    <parameters>
> >       <reader>CommaSeparetedCsvReader_Skips2Rows</reader>
> >    </parameters>
> > </component>
>
> > Ideally I would like to register only the CommaSeparetedCsvReader
> > component but when an attempt is made to resolve
> > CommaSeparetedCsvReader_Skips2Rows it should strip the suffix, parse it and
> > change the properties accordingly.
>
> > Is it possible to somehow modify the Resolve() behavior?
>
> > Thanks
> > Tom
>
> > On Wednesday, January 2, 2013 2:58:49 PM UTC+1, Patrick Steele wrote:
>
> >> If you only have one implementation of ICsvReader registered then any
> >> component that depends on an ICsvReader will get that one component
> >> (assuming it's being resolved via Windsor).
>
> >> I guess I'm confused because you said you have multiple implementations
> >> of ICsvReader but you only want to register one of them.  Could you give a
> >> code example of how you'd like your code to look like in terms of
> >> registration and component resolution?
>
> >> ---
> >> Patrick Steele
> >>http://weblogs.asp.net/psteele
>
> >> On Mon, Dec 31, 2012 at 4:13 AM, Tomek Pluskiewicz 
> >> <[email protected]>wrote:
>
> >>> Hi
>
> >>> I have a seemingly simple use case. There is a ICsvReader component.
> >>> Let's name it simply Reader here. We load a known set of CSV files and
> >>> some of them have headers and some don't. Currently there are multiple
> >>> readers: Reader_Skips1Row, Reader_Skips2Rows etc.
>
> >>> Is there a way to register only one component and have Windsor look at
> >>> the component key, strip the "_Skips..." part and resolve the required
> >>> component with relevant properties set?
>
> >>> I have tried subresolver and facility with no luck.
>
> >>> Thanks,
> >>> Tom
>
> >>> --
> >>> You received this message because you are subscribed to the Google
> >>> Groups "Castle Project Users" group.
> >>> To post to this group, send email to castle-pro...@**googlegroups.com.
>
> >>> To unsubscribe from this group, send email to castle-project-users+**
> >>> [email protected].
> >>> For more options, visit this group athttp://groups.google.com/**
> >>> group/castle-project-users?hl=**en<http://groups.google.com/group/castle-project-users?hl=en>
> >>> .
>
> >>  --
> > You received this message because you are subscribed to the Google Groups
> > "Castle Project Users" group.
> > To view this discussion on the web visit
> >https://groups.google.com/d/msg/castle-project-users/-/typu96C1blsJ.
>
> > To post to this group, send email to [email protected]
> > .
> > To unsubscribe from this group, send email to
> > [email protected].
> > For more options, visit this group at
> >http://groups.google.com/group/castle-project-users?hl=en.

-- 
You received this message because you are subscribed to the Google
Groups "Castle Project Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/castle-project-users?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/castle-project-users?hl=en.

Reply via email to