【问题标题】:Pass array of types to constructor using Unity Dependency Injection使用 Unity 依赖注入将类型数组传递给构造函数
【发布时间】:2018-09-27 18:54:47
【问题描述】:

我有几个从接口派生的类

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>()) ); 

知道我做错了什么吗?

【问题讨论】:

  • 嗨朋友,你要传递数组中有多少项?
  • 大概有 15 件。

标签: c# dependency-injection unity-container


【解决方案1】:

对于 Unity v5:

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

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

对于 v4:

Unity 内部无法理解 IEnumerable&lt;&gt; (see here),因此您需要更改构造函数以采用数组而不是可枚举

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

【讨论】:

  • 删除 InjectionConstructor 时出现异常。 System.InvalidOperationException:当前类型 System.Collections.Generic.IEnumerable`1[PC.Domain.Interfaces.IMetadataItem] 是接口,无法构造。您是否缺少类型映射?
  • @Tomas 你用的是什么版本的 Unity?
  • 我用的是4.1版本,要不要升级到5?
  • @Tomas 我已经用 5 测试过了。在升级之前,Unity 的旧版本在内部无法理解IEnumerable&lt;&gt;,你可以在MetadataService 的构造函数中尝试IMetadataItem[]
  • 成功了!我在编码时使用了 IMetadataItem[],但 Resharper 建议重构为 IEnumerable。我没想到它会有所作为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 2015-12-17
相关资源
最近更新 更多