Thursday, April 28, 2011

Castle Windsor can't inject an array of interface types

I have a class that takes an array of interfaces in the constructor:

public class Foo<T1, T2> : IFoo<T1, T2>
{
    public Foo(IBar[] bars)
    {
        ...
    }
}

My container registration looks as follows:

container.Register(AllTypes.Pick().FromAssemblyNamed("...")
                    .WithService.FirstInterface());
container.AddComponent("foo", typeof(IFoo<,>), typeof(Foo<,>));

I have several implementations of IBar, and the container can definately locate them, as calling ServiceLocator.Current.GetAllInstances<IBar>() works fine.

However, if I try to get an instance of IFoo, it throws an exception saying it couldn't satisfy the deoendency... "which was not registered".

If I change the constructor to take a single instance of IBar it works fine.

Any ideas?

From stackoverflow
  • Add the ArrayResolver:

    container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel));
    
    Mauricio Scheffer : See also the Windsor FAQ: http://using.castleproject.org/display/IoC/FAQ
    Ben Laan : Can this be done via the config file instead?
    Mauricio Scheffer : @Ben: not currently, but you may suggest it on uservoice: http://castle.uservoice.com : "Add subresolvers via xml config"
    Mauricio Scheffer : Or better yet fork the source http://github.com/castleproject/Castle.InversionOfControl and implement it ;-)
    GlennS : Thanks, this solved it for me as well. The internet seems to be full of people reinventing custom versions of this class...
    Morten : If I didn't register with WithService then the ArrayResolver didn't resolve the array, but WithService fixes that.

0 comments:

Post a Comment