2010-12-06 2 views
3

Я сейчас работаю над веб-приложением MVC3 и исправил новую проблему с Ninject.MVC3 Конструктор контроллера + Ninject

Я использую следующий код в мой контроллер:

public class TestController : Controller 
{  
    public IRepository<CustomerModel> rep; 

    public TestController(IRepository<CustomerModel> repository) 
    { 
     this.rep = repository; 
    } 

    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

И мой модуль Ninject:

public class RepositoryModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind(typeof(IRepository<>)).To(typeof(Repository<>)); 
    } 
} 

Однако это просто бросает меня «System.MissingMethodException: Нет без параметров конструктора, определенные для этого объект «. когда я пытаюсь отобразить представление Index.

Если я после этого добавить:

public TestController() : this(new Repository<CustomerModel>(new XenCRMEntities())) { } 

так мой на самом деле TestController выглядит следующим образом:

public class TestController : Controller 
{  
    public IRepository<CustomerModel> rep; 

    public TestController() : this(new Repository<CustomerModel>(new XenCRMEntities())) { } 

    public TestController(IRepository<CustomerModel> repository) 
    { 
     this.rep = repository; 
    } 

    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

Он работает, но, как вы можете увидеть новый конструктор в значительной степени разрушить всю точку IoC.

Как исправить это?

Заранее спасибо.

+0

, что контроллер завода вы используете ? –

+0

Я просто использую обычную реализацию фабрики контроллеров MVC. Я прочитал, что вы можете создать фабрику пользовательских контроллеров, чтобы исправить это, однако мне удалось найти примеры, когда люди используют Structuremap ... – ebb

+0

см. Http: //www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-получает-support-for-mvc3/ –

ответ

2

Оказывается, что его не на то будет контроллер Мессинг его, но Ninject Dont Bind мой общий репозиторий и IRepository правильно - я поэтому создал новый пост: Ninject + Bind generic repository

2

Вам необходимо будет изменить заводскую настройку контроллера, так как обычная фабрика контроллера MVC не выполняет DI.

Вы можете посмотреть здесь для получения дополнительной информации о настройке MVC + Ninject: MVC3 + Ninject - How to?

+0

Этот dosent решает мою проблему, так как проблема, с которой я сталкиваюсь, имеет другой тип и не связана с этим сообщением. – ebb

+0

Извините, может быть, я не был слишком ясен. Если вы не хотите добавлять конструктор без параметров, вы должны изменить фабрику своего контроллера на тот, который делает инъекцию зависимостей, используя Ninject. Добавление одного довольно просто, так как есть команда, предоставленная командой Ninject. Вы можете получить инструкции по загрузке и инструкции [здесь] (https://github.com/ninject/ninject.web.mvc) – CGK

+0

Хм ... Не можете найти фабрику контроллеров по указанной ссылке o: o (по крайней мере, не для MVC3) – ebb

4

Краткий тест показал, что нет проблем с общими связями в расширении MVC3. Я предполагаю, что проблема не в контроллере, но что репозиторий не может быть создан, потому что он имеет некоторые неизвестные зависимости.

Но это привело меня к тому, чтобы немного изменить преобразователь зависимостей, чтобы показать стек стеков Ninject всякий раз, когда запрашиваемый тип может быть разрешен, но одна из его зависимостей не может быть решена. Обновите последнюю версию на сервере сборки, чтобы получить лучшую трассировку стека.

0

Не используйте это связывание !!!

Bind (TypeOf (IRepository <>)) К (TypeOf (Repository <>)).

Я изменил мое использование кода это связывание и сервер разбился, он работает для одного пользователя, но и для тысяч запросов это действительно плохо

Использование реализации

Bind(typeof(IRepository<IClass>)).To(typeof(Repository<Class>)) 
Смежные вопросы