13

嗨,我一直无法告诉 Unity 对于一个接口,如果它有多个实现,我希望它将它们注入到不同的类中。这就是我的意思:

假设我有一个接口IProductCatalogService和两个实现 ProductCatalog : IProductCatalogService,并且ProductCatalogService : IProductCatalogService.

我将如何告诉 Unity 对于 Class AI 想要在我的构造函数中传递一个类型的实例,ProductCatalog而对于 ClassB我想要一个ProductCatalogService.

我在 ASP.NET Web API 项目中使用 Unity,并且在GLobalConfiguration.

对于简单的 1 对 1 注册,一切正常。

这是我尝试过的,但似乎不起作用:

public class DependencyServiceModel
{
    public Type From { get; set; }
    public Type To { get; set; }
    public IEnumerable<Type> ForClasses { get; set; }
}

public void RegisterTypeForSpecificClasses(DependencyServiceModel dependencyService)
{
    foreach (var forClass in dependencyService.ForClasses)
    {
        string uniquename = Guid.NewGuid().ToString();

        Container.RegisterType(dependencyService.From, 
            dependencyService.To, uniquename);

        Container.RegisterType(forClass, uniquename, 
            new InjectionConstructor(
                new ResolvedParameter(dependencyService.To)));
    }
}

在 中DependencyServiceModelFrom是接口,To是我要实例化的对象,是ForClasses我要使用该To对象的类型。

4

2 回答 2

30

在下面的示例中,您有一个接口实现了两次,并根据您的请求按需注入到两个不同的客户端类中。诀窍是使用命名注册。

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer container = new UnityContainer();
        container.RegisterType<IFoo, Foo1>("Foo1");
        container.RegisterType<IFoo, Foo2>("Foo2");

        container.RegisterType<Client1>(new InjectionConstructor(new ResolvedParameter<IFoo>("Foo1")));
        container.RegisterType<Client2>(new InjectionConstructor(new ResolvedParameter<IFoo>("Foo2")));

        Client1 client1 = container.Resolve<Client1>();
        Client2 client2 = container.Resolve<Client2>();
    }
}

public interface IFoo
{

}

public class Foo1 :IFoo
{

}

public class Foo2 : IFoo
{

}

public class Client1
{
    public Client1(IFoo foo)
    {

    }
}

public class Client2
{
    public Client2(IFoo foo)
    {

    }
}

这很可能是您做错的事情:

 Container.RegisterType(forClass, uniquename, 
        new InjectionConstructor(
            new ResolvedParameter(dependencyService.To)));

您为具体类创建一个命名注册。相反,你应该有

 Container.RegisterType(forClass, null, 
        new InjectionConstructor(
            new ResolvedParameter(dependencyService.To, uniquename)));
于 2013-09-06T20:20:01.657 回答
0

很高兴知道。如果你向一个接口注册了多个类型,比如 belove;

container.RegisterType<ITransactionsService, EarningsManager>();
container.RegisterType<ITransactionsService, SpendingsManager>();

您无法获取类型列表;

IEnumerable<ITransactionsService> _transactionsService;

列表中的此处将始终是最后注册的类型(SpendingsManager。)

为了防止这种情况;

container.RegisterType<ITransactionsService, EarningsManager>("EarningsManager");
container.RegisterType<ITransactionsService, SpendingsManager>("SpendingsManager");

您必须以这种方式更改代码。

于 2021-04-16T14:37:19.077 回答