複数の名前付き登録を作成する必要はありません。名前付き登録は、通常、名前付き登録が異なる場合に使用されます。例えば異なる実装タイプ、または異なる依存関係など
工場での実装は機能しますが、別のファクトリクラスを作成するのではなく、UnityのInjectionFactory
を使用してください。これにより、別個のファクトリクラスの作成が節約され、サービスパラメータは、依存関係を提供できるオブジェクトではなく、実際の依存関係になります。別の利点は、ファクトリクラスがUnityに依存しないことです(ファクトリクラスでResolve()
を使用して、ファクトリが返すオブジェクトのオブジェクトグラフを構築することを前提とします)。た。servicemanagementとのため
var container = new UnityContainer();
container.RegisterType<IWorker, Worker>();
container.RegisterType<List<IWorker>>(new InjectionFactory(c =>
{
var workers = new List<IWorker>();
for (var i = 0; i < 5; i++)
{
workers.Add(c.Resolve<IWorker>());
}
return workers;
}));
var service = container.Resolve<ServiceManagement>();
List<IWorker>
異なるが必要な場合(例えば、1つのリスト:以下の例では
はその後、我々は適切にファクトリクラスを作成したり、カスタム工場に
IUnityContainer
インスタンスを渡さず
IWorker
を解決することができますOrderManagementの異なるリスト)、それぞれの実装を登録してから、適切なサービスに名前を付けることができます。
var container = new UnityContainer();
container.RegisterType<IWorker, Worker>();
container.RegisterType<List<IWorker>>(typeof(ServiceManagement).Name,
new InjectionFactory(c =>
{
var workers = new List<IWorker>();
for (var i = 0; i < 5; i++)
{
workers.Add(c.Resolve<IWorker>());
}
return workers;
}));
container.RegisterType<List<IWorker>>(typeof(OrderManagement).Name,
new InjectionFactory(c =>
{
var workers = new List<IWorker>();
for (var i = 0; i < 20; i++)
{
workers.Add(c.Resolve<IWorker>());
}
return workers;
}));
container.RegisterType<ServiceManagement>(
new InjectionFactory(c => new ServiceManagement(c.Resolve<List<IWorker>>(typeof(ServiceManagement).Name))));
container.RegisterType<OrderManagement>(
new InjectionFactory(c => new OrderManagement(c.Resolve<List<IWorker>>(typeof(OrderManagement).Name))));
var service = container.Resolve<ServiceManagement>();
var order = container.Resolve<OrderManagement>();
私はそれが最善のアプローチだと思います。私の答えを見てください。 :) –