web-dev-qa-db-ja.com

Unityは1つのインターフェイスの複数のオブジェクトに登録し、Unityにそれらを挿入する場所を指示します

こんにちは私はUnityに、インターフェイスに複数の実装がある場合、それらを異なるクラスに挿入するように指示するのに苦労しています。これが私が意味することです。

インターフェースIProductCatalogServiceと2つの実装ProductCatalog : IProductCatalogServiceProductCatalogService : IProductCatalogServiceがあるとしましょう。

コンストラクターで必要なクラスAには、タイプProductCatalogのインスタンスが渡され、クラスBには、ProductCatalogServiceのインスタンスが必要であることをUnityに伝えるにはどうすればよいですか。

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)));
    }
}

DependencyServiceModelでは、Fromはインターフェース、Toはインスタンス化したい魔女のオブジェクト、ForClassesは使用したいタイプです。 Toオブジェクト。

11
aleczandru

以下の例では、インターフェイスが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)));
27
Wiktor Zychla