Проблема IOC в NET.Core 2.0 для неизвестного конструктора - PullRequest
0 голосов
/ 10 мая 2018

Я немного застрял с NET.Core 2.0 и IOC.

У меня есть разные классы, которые реализуют интерфейс IAction, эти классы могут иметь разные конструкторы, которые я не знаю в области инициализации. Вот пример:

public class UpgradeAction : IAction
{
    protected readonly IUpgradeManager upgradeManager;
    public UpgradeAction(IUpgradeManager upgradeManager)
    {
        this.upgradeManager = upgradeManager;
    }

    public void Process(BaseRequest request)
    {
        upgradeManager.DoUpgrade(request);
    }
}

Пока я получаю ошибку конструктора ParameterLess, если я использую эту функцию

var t =  (IAction)Activator.CreateInstance(typeOfAction);

Этот возвращает нулевой объект.

var t = (IAction)serviceProvider.GetService(typeOfAction);

Есть ли способ инициализации конфигурации IOC для включения такого рода реализации? Так что конкретный конструктор нужного класса используется для выполнения инъекции.

На самом деле я добавил в свой стартап это и многое другое. Весь мой IOC работает, если я не пройду мимо этого ActionManager (ТАК IUpgradeManager внедряется непосредственно в мой контроллер API). Так что я мог бы сделать это, и все, но я хочу использовать этот ActionManager, чтобы включить конвейер одной команды в разные процессы для создания некоторой подключаемой архитектуры.

     public void Startup(IServiceCollection services)
    {
        services.AddTransient<IUpgradeManager, UpgradeManager>();
        services.AddTransient<IAction, UpgradeAction>();

        AutoMapper.DefaultMappers(typeof(DataLink).Assembly);
    }

1 Ответ

0 голосов
/ 11 мая 2018

Это сделает свое дело.

  • Получаем параметры конструктора
  • Мы вызываем поставщика услуг для получения объектов параметров
  • Мы вызываем CreateInstance с дополнительными параметрами для объектов, которые будут использоваться в конструкторе.

var ci = action.GetConstructors().First();
var ciParameters = new List<Object>();
foreach(var parameter in ci.GetParameters())
{                  
    ciParameters.Add(serviceProvider.GetService(parameter.ParameterType));
}
var t = (IAction)Activator.CreateInstance(action, ciParameters.ToArray());

Другой вариант использования

serviceProvider.GetService(typeof(UpgradeAction))

только для регистрации класса:

services.AddTransient<UpgradeAction>();

Регистрация интерфейса не работает. Может быть, нам нужен какой-то перегруженный метод GetService, чтобы он работал => GetService (тип)?

services.AddTransient<IAction, UpgradeAction>();
...