使用 Unity 依赖注入将类型数组传递给构造函数
Pass array of types to constructor using Unity Dependency Injection
我有几个 class 派生自接口
public interface IMetadataItem
{
Do();
}
public class MyClass1 : IMetadataItem
{
public void Do()
{
}
}
public class MyClass2 : IMetadataItem
{
public void Do()
{
}
}
我想将 IMetadataItem 接口的这些 classes 绑定到另一个 class
的构造函数
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>()) );
知道我做错了什么吗?
对于 Unity v5:
您可以从 RegisterType
中删除第二个参数 InjectionConstructor
container.RegisterType<IMetadataService, MetadataService>(
new ContainerControlledLifetimeManager());
对于 v4:
Unity 内部无法理解 IEnumerable<>
(see here),因此您需要更改构造函数以采用数组而不是可枚举
public class MetadataService: IMetadataService
{
public MetadataService(IMetadataItem[] metadataItems)
{
}
}
我有几个 class 派生自接口
public interface IMetadataItem
{
Do();
}
public class MyClass1 : IMetadataItem
{
public void Do()
{
}
}
public class MyClass2 : IMetadataItem
{
public void Do()
{
}
}
我想将 IMetadataItem 接口的这些 classes 绑定到另一个 class
的构造函数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>()) );
知道我做错了什么吗?
对于 Unity v5:
您可以从 RegisterType
InjectionConstructor
container.RegisterType<IMetadataService, MetadataService>(
new ContainerControlledLifetimeManager());
对于 v4:
Unity 内部无法理解 IEnumerable<>
(see here),因此您需要更改构造函数以采用数组而不是可枚举
public class MetadataService: IMetadataService
{
public MetadataService(IMetadataItem[] metadataItems)
{
}
}