Search code examples
c#dependency-injectionunity-container

Injecting arrays with Unity


My goal is to constructor inject an array of objects implementing an interface.

The following is the way I currently have it.

Container

        .RegisterInstance<Company>(ParseCompany(args[1])

        .RegisterInstance<eTargets>(ParseTargets(args[2]))

        .RegisterInstance<ILoader[]>(new ILoader[] {
            Container.Resolve<CustomerLoader>(),
            Container.Resolve<PaymentLoader(),
            Container.Resolve<InvoiceLoader() 
        });

Is it typical to call Resolve in container configuration this way or is there a more standard way to accomplish the same thing?


Solution

  • Unity natively understands arrays, so there's no reason to make it so complicated. Just register the ILoaders you want to include and resolve the object graphs normally. Auto-wiring will take care of the rest:

    container.RegisterType<ILoader, FooLoader>("foo");
    container.RegisterType<ILoader, BarLoader>("bar");
    container.RegisterType<ILoader, BazLoader>("baz");
    
    var c = container.Resolve<MyConsumer>();
    

    assuming that the MyConsumer constructor is defined like this:

    public MyConsumer(ILoader[] loaders)
    

    However, you should be aware that (for some unfathomable reason) Unity only includes named components in this way. The default component:

    container.RegisterType<ILoader, Loader>();
    

    will not be included in the array, since it has no name.