使用Unity依赖注入将类型数组传递给构造函数

时间:2018-09-27 07:50:35

标签: c# dependency-injection unity-container

我有几个从接口派生的类

public interface IMetadataItem
{
  Do();
}

public class MyClass1 : IMetadataItem
{
  public void Do()
  {
  }
}

public class MyClass2 : IMetadataItem
{
 public void Do()
 {
 }
}

我想将IMetadataItem接口的这些类绑定到另一个类的构造函数

public class MetadataService: IMetadataService
{
  public MetadataService(IEnumerable<IMetadataItem> metadataItems)
  {
    //metadataItems always has zero(0) items
  }
}

不幸的是,我总是得到空的IEnumerable列表。

Unity配置看起来像

     container.RegisterTypes(
            AllClasses.FromLoadedAssemblies().Where(type => typeof(IMetadataItem).IsAssignableFrom(type)),
            WithMappings.FromAllInterfaces,
            WithName.TypeName,
            WithLifetime.ContainerControlled);

        container.RegisterType<IMetadataService, Services.MetadataService>(new ContainerControlledLifetimeManager(),
            new InjectionConstructor(new ResolvedArrayParameter<IMetadataItem>()) ); 

知道我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

对于Unity v5:

您可以从InjectionConstructor删除第二个参数RegisterType

container.RegisterType<IMetadataService, MetadataService>(
    new ContainerControlledLifetimeManager());

对于v4:

Unity内部不了解IEnumerable<>see here),因此您需要将构造函数更改为采用数组而不是可枚举的

public class MetadataService: IMetadataService
{
    public MetadataService(IMetadataItem[] metadataItems)
    {
    }
}