Я пытаюсь зарегистрировать объекты в контейнере DryIoc с использованием фабрики.
void Main()
{
var container = new Container();
container.Register<IFactory, Factory>();
container.Register<IService>(
made: Made.Of(r => ServiceInfo.Of<IFactory>(), f => f.Create("default")));
container.Resolve<IService>().Dump();
container.Resolve<IService>("name1").Dump();
container.Resolve<IService>("name2").Dump();
}
public interface IFactory
{
IService Create(string name);
}
public class Factory : IFactory
{
public IService Create(string name) => new Service(name);
}
public interface IService
{
string Name { get; }
}
public class Service : IService
{
public Service(string name) => Name = name;
public string Name { get; }
}
Я хочу, чтобы используемая при разрешении политика была параметром, переданным в метод фабрики.В приведенном выше коде я жестко закодировал этот параметр в "name"
, но я бы хотел, чтобы вместо него использовалась политика.В частности, во 2-м и 3-м вызовах Resolve параметр, передаваемый в метод фабрики, должен быть name1
и name2
соответственно.
3 вызова для разрешения успешны только для первого вызова,другие два не работают, потому что в контейнере нет регистрации с политикой name1
или name2
.Теперь я знаю, что политики могут быть объектами всех типов, а не просто строками, но даже в этом случае я хотел бы, чтобы это работало для моего случая.
Так есть ли способ настроить регистрационный вызов, чтобы принятьполитики и внедрить его в фабричный метод:
container.Register<IService>(
made: Made.Of(r => ServiceInfo.Of<IFactory>(), f => f.Create(<what to put here>)));
^
|
... +-----------------------------------------+
|
container.Resolve<IService>("name1");
Я просмотрел пространство имен, в котором у меня есть Arg.Of
и ServiceInfo.Of
, но, похоже, нет ничего, что указывало бы, что это можетбыть полезным.
Обратите внимание, что правильным ответом на этот вопрос может быть даже «Это невозможно».Возможно, нет способа сделать то, что я прошу, и что действительно должно быть несколько регистраций, по одной для каждой политики.