Зарегистрируйте Open Generi c в do tnet core 3 - PullRequest
0 голосов
/ 22 февраля 2020

Я пытаюсь зарегистрировать тип Open Generi c в своем приложении, но у меня странное поведение.

Следующее работает правильно:

services.AddTransient(typeof(IA<>), typeof(A<>));

Сейчас Я хотел бы передать параметры в мой A класс, потому что у моего конструктора есть несколько аргументов:

services.AddTransient(typeof(IA<>), provider =>
{
    return ActivatorUtilities.CreateInstance(provider, typeof(A<>), "1", "2");
});

Это генерирует исключение

'Open generi c service тип 'IA`1 [T]' требует регистрации открытого типа реализации generi c. (Параметр 'descriptors') '

Хорошо, поэтому я упростил свою фабрику и просто сделал что-то вроде этого:

services.AddTransient(typeof(IA<>), provider => typeof(A<>));

Но это создает точно такое же исключение.

Вопрос прост: как зарегистрировать Open Generi c с параметрами по умолчанию. net core DI? (Я не хочу использовать стороннюю библиотеку, такую ​​как Castle Windsor)

Обратите внимание, что конструктор A<> имеет необязательный параметр, поэтому services.AddTransient(typeof(IA<>), typeof(A<>)); работает

1 Ответ

1 голос
/ 22 февраля 2020

Вы можете заключить конструктор A<> параметров в класс и внедрить его вместо передачи параметров

services.AddTransient(typeof(IA<>), typeof(A<>));
services.AddTransient<AOptions>(sp => new AOptions { X = "1", Y = "2" });
public class A<T> : IA<T>
{
    private readonly AOptions _aOptions;

    public A(AOptions aOptions = null)
    {
        _aOptions = aOptions;
    }
}

public class AOptions
{
    public string X { get; set; }
    public string Y { get; set; }
}
...