こんにちは私はUnityに、インターフェイスに複数の実装がある場合、それらを異なるクラスに挿入するように指示するのに苦労しています。これが私が意味することです。
インターフェースIProductCatalogService
と2つの実装ProductCatalog : IProductCatalogService
とProductCatalogService : 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
オブジェクト。
以下の例では、インターフェイスが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)));