Использование ActivatorUtilities.CreateInstance Для создания экземпляра из типа - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь переписать некоторый код в .Net Core с помощью встроенного .Net Dependency Injection.Ранее я использовал текущий код для создания экземпляра (он использовал Unity для DI), который отлично работал.

var instance = (IPipe)UnityHelper.Container.Resolve(implementation);

Для .Net Core я сначала попробовал стандарт Activator.CreateInstance, и это работало нормально исоздал экземпляр IPipe, который я ожидал.

var instance = (IPipe)Activator.CreateInstance(implementation)

Однако.Тогда возникает проблема: если реализации внедряют службы в ctor, они не будут решены (вот почему я использовал Unity.Resolve в предыдущем проекте, чтобы обойти это).

После некоторогоВ ходе исследования я узнал о классе ActivatorUtilities и поменял его на приведенный ниже код (serviceProvider IServiceProvider)

var instance = ActivatorUtilities.CreateInstance<IPipe>(serviceProvider, implementation);

Однако сейчас я получаю текущую ошибку.

Не удалось найти подходящий конструктор для типа «IPipe».Убедитесь, что тип конкретный, а службы зарегистрированы для всех параметров общедоступного конструктора.

Я не понимаю, почему Activator.CreateInstance работает нормально, но это жалуется на конструктор IPipe?

1 Ответ

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

Общий ActivatorUtilities.CreateInstance<T>(IServiceProvider, Object[]) фактически создаст экземпляр типа T и попытается разрешить аргументы конструктора типа с помощью поставщика услуг.Массив объектов, который вы можете передать, предназначен для дополнительных аргументов конструктора , которые не предоставлены поставщиком услуг.

Если вы просто хотите создать экземпляр типа времени выполнения и внедрить контейнер DIзависимости, то вам нужно будет использовать неуниверсальный ActivatorUtilities.CreateInstance(IServiceProvider, Type, Object[]).

Этот метод возвращает object, поэтому вы должны привести его к типу, если хотитеиспользуй это.Например:

var instance = (IPipe)ActivatorUtilities.CreateInstance(serviceProvider, pipeType);
...