Krzysztof,
Thanks for the reply. Normally would have just passed the factory as a
dependency just like José indicated, just wanted to understand why the
IEnumerable dependency behaved differently to how i expected it to
behave.


Thanks
Pat

On Jan 9, 2:55 am, Krzysztof Koźmic <[email protected]>
wrote:
> Well - you've neved had this issue because although the division is
> arbitrary it gets it right in 99.9% of cases.
>
> It's only the quirky ones, like Uri or this one that it's wrong.
> That's also probably why it was never really fixed - no one demanded it.
>
> Krzysztof
>
> On 09/01/2011 12:52 PM, José F. Romaniello wrote:
>
> > 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/45540...
>
> >> 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...
>
> >>>      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]
>
> ...
>
> read more >>

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