There is a resolver for that, you can use:
container.Kernel.Resolver.AddSubResolver(new
CollectionResolver(container.Kernel, true));

then you can register all your Apples as such, and inject
IEnumerable<Apple>, Apple[], IList<Apple> or ICollection<Apple>

(More info here: http://stw.castleproject.org/Windsor.Resolvers.ashx )

So, you wouldn't need a factory or anything else.

Maybe IEnumerable<T> are handled differently, not sure about this.

2011/1/8 pmcg <[email protected]>

> Hi,
> I'm trying to understand why when I have a registered an IEnumerable
> component, which I can resolve using a normal resolve method call, the
> container will not satisfy another component's resolution call where
> this second component has the same IEnumerable type dependency. I have
> managed to get it to work using the DynamicParameters registration
> helper method. I guess I could also get it to work using service
> overrides.
> Note I am using a factory method to create the IEnumerable component.
>
> This simple example illustrates what I’m trying to understand, if you
> remove the DynamicParameters usage in the Worker component
> registration, its apples dependency will not be satisfied, even though
> we could resolve the apples collection when doing so directly against
> the container
>
> Should the container not be able to satisfy the Worker apples
> dependency without the help of DynamicParameters ?
>
>
> Thanks in advance
> Pat
>
>
>
>
> var _container = new WindsorContainer();
> _container.AddFacility("factorySupport", new
> FactorySupportFacility());
>
> _container.Register(
> Component.For<AppleFactory>()
>  .Named("appleFactory"));
>
> _container.Register(
> Component.For<IEnumerable<Apple>>()
>  .Named("apples")
>  .LifeStyle.Transient
>  .UsingFactoryMethod(kernel =>
> kernel.Resolve<AppleFactory>().GetAll()));
>
> // If i don't include the DynamicParameters statement - Could not
> resolve non-optional dependency for 'worker' (Worker). Parameter
> 'apples' type 'System.Collections.Generic.IEnumerable`1[[Apple,
> ConsoleApplication1, Version=1.0.0.0, Culture=neutral,
> PublicKeyToken=null]]'
> _container.Register(
> Component.For<Worker>()
>  .Named("worker")
>  .LifeStyle.Transient
>  .DynamicParameters((kernel, parameters) => { parameters["apples"] =
> (kernel.Resolve<AppleFactory>()).GetAll(); }));  // Could have just
> used the apple factory directly here but i may want caching\logging
> etc logic
>
> var _apples = _container.Resolve<IEnumerable<Apple>>();
> Console.WriteLine("Managed to resolve apples component, count = {0}",
> _apples.Count());
>
> Console.WriteLine("Now trying to resolve a worker which has an apples
> dependancy which fails ");
> var _worker = _container.Resolve<Worker>();
> _worker.DoIt();
>
> --
> 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]<castle-project-users%[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