Thank you. I dont know why but ive been using windsor for years and
never face this issue.

In this scenario, the first I would do is to inject the factory. For
instance, I do this on my domain-event publisher. (But that is only my
way of thinking)

I ve used ienumerables for the other case(collection resolver).

2011/1/8, Krzysztof Koźmic <[email protected]>:
> Jose, Pat
>
> I ran your test and I did reproduce your issue. This is a known
> limitation in Windsor right now that goes back to the early days.
> http://castle.uservoice.com/forums/38955-windsor-v3/suggestions/455402-get-rid-of-the-arbitrary-division-for-service-para?ref=title
>
> In short, Windsor has three "kinds" of dependencies:
> services (the most common one: from the container give me any
> component's instance that support this service)
> service overrides (from the container give me specific component's instance)
> parameters (which is used for things like strings, ints etc: from the
> component's configuration/local context give me the value)
>
> Notice that for parameters it does not look in the container. The
> problem is - for this dependency Windsor treats it as parameter (like I
> said - the division is very arbitrary and sometimes gets it wrong).
>
> For current version probably the best workaround is to use
> DynamicParameters to provide the value...
>
>
> for the next version (codenamed Wawel) we accept patches :)
>
> On 08/01/2011 11:21 PM, José F. Romaniello wrote:
>> 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]
>> <mailto:[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] <mailto:[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]
>>         <mailto:[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] <mailto:[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]
>>         <mailto:[email protected]>
>>         > > .
>>         > > To unsubscribe from this group, send email to
>>         > > [email protected]
>>
>> <mailto:castle-project-users%[email protected]><castle-project-users%[email protected]
>>         <mailto: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]
>>         <mailto:[email protected]>.
>>         To unsubscribe from this group, send email to
>>         [email protected]
>>         <mailto: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.
>
> --
> 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.
>
>

-- 
Enviado desde mi dispositivo móvil

-- 
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