Как создать экземпляр класса и внедрить зависимости, не регистрируя его в DryIoc?

Мне нужно создать экземпляр класса с некоторыми параметрами, не регистрируя его в контейнере, так как мне часто нужно получить некоторые классы с внедренными зависимостями, не загромождая контейнер.

Вот пример:

interface IPrinter
{
    void Print(string text);
}
class ConsolePrinter : IPrinter
{
    public void Print(string text) => Console.WriteLine(text);
}
class Thing
{
    public Thing(IPrinter print, string otherParameter)
    {
        // ...
    }
}
class Program
{
    static void Main(string[] args)
    {
        var container = new Container();

        container.Register<IPrinter, ConsolePrinter>();

        // This throws.
        container.Resolve<Thing>(args: new object[] { "something something" });
    }
}

Я получаю исключение: DryIoc.ContainerException: 'code: UnableToResolveUnknownService, что имеет смысл.

Конечно, я могу просто сделать container.Register<Thing>(), но, как было сказано ранее, это добавит нежелательную службу в мой контейнер.


person jeuxjeux20    schedule 23.03.2020    source источник
comment
Является ли otherParameter аргументом времени выполнения или он известен (и фиксируется) во время регистрации контейнера? Эта информация необходима для ответа на ваш вопрос.   -  person Steven    schedule 24.03.2020
comment
Это аргумент времени выполнения   -  person jeuxjeux20    schedule 24.03.2020


Ответы (1)


Вы можете попробовать установить WithConcreteTypeDynamicRegistrations правила контейнера.

person dadhi    schedule 24.03.2020
comment
Спасибо за ответ, хотя с этим кодом: rules.WithConcreteTypeDynamicRegistrations((_, serviceKey) => "meow".Equals(serviceKey), Reuse.Singleton) и выполнением container.Resolve<Thing>(args: new object[] { "something something" }, serviceKey: "meow") лямбда оценивается дважды, сначала с фактическим serviceKey ("meow"), а затем с serviceKey равным null, что приводит к разрешению отказ. Но без сравнения serviceKey...! - person jeuxjeux20; 24.03.2020
comment
Пожалуйста, создайте задачу с этой информацией в репозитории DryIoc github. - person dadhi; 25.03.2020
comment
Вот в чем проблема - person jeuxjeux20; 25.03.2020