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)
    {
        ....
    }

    ....
}