Внедрение зависимости конструктора в контроллере MVC ASP.NET

Легче получить отслеживание стека на Firefox, чем это находится на IE, но существенно вот то, что Вы хотите сделать:

Обертка "проблематичная" часть кода в блоке попытки/выгоды:

try {
    // some code that doesn't work
    var t = null;
    var n = t.not_a_value;
}
    catch(e) {
}

при исследовании содержания "ошибочного" объекта, он содержит следующие поля:

e.fileName: исходный файл / страница, куда проблема прибыла из e.lineNumber: номер строки в файле/страница, где проблема возникла e.message: простое сообщение, описывающее, какая ошибка произошла e.name: тип ошибки, которая произошла, в примере выше его должен быть 'TypeError' e.stack: Содержит отслеживание стека, которое вызвало исключение

, я надеюсь, что это выручает Вас.

14
задан Finglas 8 December 2011 в 19:33
поделиться

4 ответа

Если вы хотите иметь конструкторы без параметров, вы должны определить фабрику настраиваемых контроллеров. У Фила Хаака есть отличная запись в блоге на эту тему.

Если вы не хотите разворачивать собственную фабрику контроллеров, вы можете получить их заранее в ASP.NET MVC Contrib на codeplex / github.

8
ответ дан 1 December 2019 в 13:47
поделиться

Вам не обязательно иметь пустой конструктор, если вы настраиваете настраиваемый ControllerFactory для использования инфраструктуры внедрения зависимостей, например Ninject , ] AutoFac , Castle Windsor и т. Д. У большинства из них есть код CustomControllerFactory для использования их контейнера, который можно использовать повторно.

Проблема в том, что фабрика контроллеров по умолчанию не знает как передать зависимость. Если вы не хотите использовать упомянутый выше фреймворк, вы можете сделать то, что называется внедрением зависимостей для бедняков:

public class HomeController : Controller
{

    private IDependency iDependency;

    public HomeController() : this(new Dependency())
    {
    }

    public HomeController(IDependency iDependency)
    {
        this.iDependency = iDependency;
    }
}
7
ответ дан 1 December 2019 в 13:47
поделиться

Взгляните на MVCContrib http://mvccontrib.github.com/MvcContrib/ . У них есть фабрики контроллеров для ряда контейнеров DI. Виндзор, Структурная карта и т. Д.

1
ответ дан 1 December 2019 в 13:47
поделиться

Вы можете внедрить свою зависимость по свойству, например, см .: Внедрение по свойству Использование Ninject выглядит следующим образом:

[Inject]
public IDependency YourDependency { get; set; }
1
ответ дан 1 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: