Внедрение зависимостей по именам типов - PullRequest
0 голосов
/ 13 ноября 2018

Для моего примера я использую Autofac (в этом нет необходимости):

var r = builder.RegisterType<Helper>().As<IHelper>(); // usual using

Я хотел бы иметь возможность регистрировать типы как-то так:

string name1 = "Helper";

string name2 = "IHelper";

var r = builder.RegisterType<GetTypeFromName(name1)>().As<GetTypeFromName(name2)>();

Можно ли это сделать с помощью магии отражения?

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Обычно для разрешения имени типа вам нужно предоставить больше информации, чем просто имя класса. Поэтому я думаю, что ответ "не совсем".

Метод для сопоставления строки с типом - Type.GetType, который описан здесь: https://docs.microsoft.com/en-us/dotnet/api/system.type.gettype?view=netframework-4.7.2

Как видите, в вакууме мы не можем сказать, что "Helper" или "IHelper" будет достаточно. Вы, вероятно, могли бы обойтись с именем класса, полным пространства имен. (Причина, по которой Helper работает в «жестко запрограммированном» синтаксисе, конечно, заключается в том, что компилятор может использовать преимущества операторов using при определении значения Helper. Этот параметр не работает, если GetType пытается понять строку во время выполнения.)

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

0 голосов
/ 13 ноября 2018

Если вы можете получить объект Type для типа, который хотите зарегистрировать, вы можете передать его в Autofac, используя другую перегрузку метода RegisterType, например:

var type = Assembly.LoadFrom(path).GetType(typeName);
builder.RegisterType(type);
0 голосов
/ 13 ноября 2018

Вам потребуется создать механизм, который бы «определил», какие конкретные типы вы хотите зарегистрировать и как их выставить (часть As в AutoFac).Вот пример того, как вы можете зарегистрироваться, используя System.Type, поэтому недостающая часть получает System.Type s самостоятельно.

// get your Type(s)
Type concreteType = typeof(Helper);
Type asType = typeof(IHelper);

// Autofac registration call
builder.RegisterType(concreteType).As(asType);

Как вы можете видеть в приведенном выше коде, вы должны назвать неуниверсальныйверсия методов RegisterType и As.(Универсальные версии на самом деле просто вызывают их в любом случае).

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