C# 如何使用Unity解析接口集合?
我有一个带有构造函数的类,它接受子接口的集合C# 如何使用Unity解析接口集合?,c#,unity-container,C#,Unity Container,我有一个带有构造函数的类,它接受子接口的集合 public class Manager : IManager { public Manager(IEnumerable<IDataAccess> dataAccess) { 其中每一个都有具体的实现。 解析IManager时,我希望使用FooDataAccess、BarDataAccess和BazDataAccess的集合填充dataAccess参数 我使用unity作为国际奥委会,目前的注册是: public s
public class Manager : IManager
{
public Manager(IEnumerable<IDataAccess> dataAccess)
{
其中每一个都有具体的实现。
解析IManager时,我希望使用FooDataAccess、BarDataAccess和BazDataAccess的集合填充dataAccess参数
我使用unity作为国际奥委会,目前的注册是:
public static void RegisterTypes(IUnityContainer container)
{
container.RegisterTypes(AllClasses.FromAssemblies(
typeof(IManager).Assembly),
WithMappings.FromMatchingInterface,
WithName.Default,
WithLifetime.ContainerControlled);
我在解决方案中也有一些其他类(因此使用了注册模式),所以我想保留这个。我一直在尝试自己注册IManager:
var allDataAccesses = container.ResolveAll<IDataAccess>();
var parameter = new InjectionConstructor(allDataAccesses);
container.RegisterType<IManager, Manager>(parameter);
var alldataaccess=container.ResolveAll();
var参数=新注入构造函数(AllDataAccess);
container.RegisterType(参数);
但我不能让它工作,我错过了什么。如何配置unity来解析构造函数?您所做的注册将映射直接实现的接口,而不是
IDataAccess
例如,它将IFooDataAccess
映射到FooDataAccess
。例如,您需要将IDataAccess
映射到FooDataAccess
要解决此问题,请添加以下注册码:
container.RegisterTypes(
typeof (IManager)
.Assembly
.GetTypes()
.Where(x => x.IsClass)
.Where(x => typeof (IDataAccess).IsAssignableFrom(x)),
x => new[] {typeof (IDataAccess)},
WithName.TypeName, WithLifetime.ContainerControlled);
这将在程序集中搜索实现IDataAccess
(直接或间接)的类,并将在IDataAccess
和这些类之间创建映射
这里需要注意的一件重要事情是,它为注册提供了一个名称。这一点很重要,因为如果将接口IDataAccess
映射到许多类,则不能使用默认名称。unity如何知道使用哪个地图条目
您需要做的另一件事是将IEnumerable
映射到IDataAccess[]
如下:
container.RegisterType<IEnumerable<IDataAccess>, IDataAccess[]>();
public class Manager : IManager
{
public Manager(IDataAccess[] dataAccess)
{
....
}
....
}
您所做的注册将映射直接实现的接口,而不是
IDataAccess
例如,它将IFooDataAccess
映射到FooDataAccess
。例如,您需要将IDataAccess
映射到FooDataAccess
要解决此问题,请添加以下注册码:
container.RegisterTypes(
typeof (IManager)
.Assembly
.GetTypes()
.Where(x => x.IsClass)
.Where(x => typeof (IDataAccess).IsAssignableFrom(x)),
x => new[] {typeof (IDataAccess)},
WithName.TypeName, WithLifetime.ContainerControlled);
这将在程序集中搜索实现IDataAccess
(直接或间接)的类,并将在IDataAccess
和这些类之间创建映射
这里需要注意的一件重要事情是,它为注册提供了一个名称。这一点很重要,因为如果将接口IDataAccess
映射到许多类,则不能使用默认名称。unity如何知道使用哪个地图条目
您需要做的另一件事是将IEnumerable
映射到IDataAccess[]
如下:
container.RegisterType<IEnumerable<IDataAccess>, IDataAccess[]>();
public class Manager : IManager
{
public Manager(IDataAccess[] dataAccess)
{
....
}
....
}