Activator.CreateInstance и Ninject на asp.net MVC 4
Я пытаюсь использовать рефлексию и нинъект в одном проекте. Вот мой код:
Type type = Type.GetType("MySolution.Project.Web.App_Code.DataClass");
MethodInfo theMethod = type.GetMethod("Events_ListAll");
object classInstance = Activator.CreateInstance(type, null);
И вот мой класс, который содержит этот метод:
public class DataClass
{
private IEventService eventService;
public DataClass(IEventService eventService)
{
this.eventService = eventService;
}
public String Events_ListAll()
{
List<Event> lstEvents = eventService.GetEvents().ToList<Event>();
return "";
}
}
Я получаю сообщение о том, что не найден конструктор. Решением этой проблемы будет объявление пустого конструктора по умолчанию, но это не будет внедрять класс, который я хочу. Есть ли способ решить эту проблему?
1 ответ
Вам понадобится конкретный экземпляр IEventService
передать в качестве параметра к ctor of DataClass
, как это Activator.CreateInstance(type, instance);
Итак, у вас есть много подходов для этого, см. 2 из:
1-й класс имеет конкретный IEventService
У того класса, где вы делаете отражение, есть конкретный пример
IEventService
и тогда вы просто передаете в качестве параметра Активатору:
public class Foo
{
public Foo(IEventService eventService)
{
Type type = Type.GetType("MySolution.Project.Web.App_Code.DataClass");
MethodInfo theMethod = type.GetMethod("Events_ListAll");
object classInstance = Activator.CreateInstance(type, eventService);
}
}
2-й - получить IKernel реализацию Ninject
Если вы используете
NinjectWebCommom
вы можете просто поменять опору загрузчика на общедоступную и получить ядро вот такNinjectWebCommom.bootstrapper.Kernel.get<IEventService>()
Type type = Type.GetType("MySolution.Project.Web.App_Code.DataClass");
MethodInfo theMethod = type.GetMethod("Events_ListAll");
object classInstance = Activator.CreateInstance(type, Kernel.Get<IEventService>());