Можно ли передать политику, используемую при разрешении, на заводской метод с использованием DryIoc? - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь зарегистрировать объекты в контейнере 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, но, похоже, нет ничего, что указывало бы, что это можетбыть полезным.

Обратите внимание, что правильным ответом на этот вопрос может быть даже «Это невозможно».Возможно, нет способа сделать то, что я прошу, и что действительно должно быть несколько регистраций, по одной для каждой политики.

1 Ответ

0 голосов
/ 27 октября 2018

Если под «политикой» вы подразумеваете передачу serviceKey в качестве аргумента фабричного метода, вы можете сделать это.

Вам нужно Arg.Index(int), чтобы указать пользовательский аргумент для фабричного метода:

Это может выглядеть так:

container.Register<IService>( made: Made.Of(r => ServiceInfo.Of<IFactory>(), 
    f => f.Create(Arg.Index(0)),
    r => r.ServiceKey)); 

Arg.Index(0) работает аналогично заполнителю {0} в string.Format, где вы указываете фактические аргументы после строки формата.Здесь то же самое, но аргументы могут зависеть от запроса.

Извините, если он не компилируется сразу, у него не было доступа к ноутбуку для проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...