13

こんにちは、インターフェイスに複数の実装がある場合、それらを異なるクラスに注入したいことを Unity に伝えるのに苦労しています。

インターフェイスIProductCatalogServiceと 2 つの実装 ProductCatalog : IProductCatalogServiceProductCatalogService : IProductCatalogService.

ProductCatalogクラス AI の場合はコンストラクターで type のインスタンスを渡し、クラスの場合は のBインスタンスが必要であることを Unity に伝えるにはどうすればよいでしょうか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

以下の例では、インターフェイスを 2 回実装し、要求どおりにオンデマンドで 2 つの異なるクライアント クラスに注入しています。秘訣は、名前付き登録を使用することです。

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 に答える