sorry the exception that i got is

Can't create component 'X.Tests.SomeService' as it has dependencies to be
satisfied.
X.Tests.SomeService is waiting for the following dependencies:

Keys (components with specific keys)
- samples which was not registered.



2011/1/8 José F. Romaniello <[email protected]>

> Yes, Ive tested and i've same problem here:
>
>         [TestFixture]
>
>         public class CastleTest
>
>         {
>
>
>
>                 [Test]
>
>                 public void Test()
>
>                 {
>
>                         var container = new WindsorContainer();
>
>                         container.AddFacility<FactorySupportFacility>();
>
>
>
>                         container.Register(Component.For<IEnumerable<
> ISample>>()
>
>                                                     .UsingFactoryMethod(k
> => Mocks.Of<ISample>().Where(s => s.Name == "Test").Take(10).ToArray()),
>
>                                            Component.For<SomeService>());
>
>
>
>                         container.Resolve<IEnumerable<ISample
> >>().Count().Should().Be.EqualTo(10);
>
>
>
>                         var service = container.Resolve<SomeService>();
>
>
>
>                         service.CountSamples().Should().Be.EqualTo(10);
>
>                 }
>
>         }
>
>
>
>         public class SomeService
>
>         {
>
>                 private readonly IEnumerable<ISample> samples;
>
>
>
>                 public SomeService(IEnumerable<ISample> samples)
>
>                 {
>
>                         this.samples = samples;
>
>                 }
>
>
>
>                 public int CountSamples()
>
>                 {
>
>                         return samples.Count();
>
>                 }
>
>         }
>
>
>
>         public interface ISample
>
>         {
>
>                 string Name { get; set; }
>
>         }
>
>
>
> I've never done this before, so i am confused too. and this confused me:
>
> Why is Windsor not able to inject array or list of components?
>
> http://stw.castleproject.org/Windsor.FAQ.ashx#Why_is_Windsor_not_able_to_inject_array_or_list_of_components_8
>
> Windsor, *by default when you have dependency on IFoo[], IEnumerable<IFoo>
> or IList<IFoo> will check if you have a component registered for that exact
> type (array or list of IFoo),* not if you have any components registered
> for IFoo (array of components, is not the same as a component which is an
> array). You can change the behavior to say "When you see array or list of
> IFoo just give me all IFoos you can get" you use CollectionResolver.
>
>
>
> 2011/1/8 pmcg <[email protected]>
>
>> José
>>
>> I did look at CollectionResolver, but that solves a different problem
>> than what I am trying to achieve. I will not have registered all the
>> apples in the container, I want to get the apples from the apple
>> factory and hence i have configured the apples component as transient
>> which allows me to use the factory method every time i need to satisfy
>> an apples dependency. This means the dependency collection is dynamic
>> and can change over time etc.
>> I have used a pretty simple example to illustrate, but i would expect
>> the problem is not uncommon i.e. a repository backed collection which
>> is a dependancy for another component ?
>>
>>
>> Thanks
>> Pat
>>
>>
>>
>> On Jan 8, 12:09 pm, José F. Romaniello <[email protected]> wrote:
>> > 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]>
>> <castle-project-users%[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]<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