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>());
Другие вопросы по тегам