Как получить ресурс из ninject без использования шаблона конструктора в mvc3 - PullRequest
1 голос
/ 23 октября 2011

При использовании Ninject с mvc3 мы делаем что-то вроде: устанавливаем ninject, модули-или-сервисы регистратора.

Мы пишем управление вот так

public class HomeController : Controller
{
    private IHelloService _service;
    public HomeController(IHelloService service)
    {
        _service = service;
    }

    public string Index()
    {
        return _service.GetGreeting();
    }
}

Я хочу сделать что-то вроде

public class HomeController : Controller
{
    private IHelloService _service;

    /*
          No default constructor
    */

    public string Index()
    {
        _service= Ask_Ninject_to_provide_resource
        return _service.GetGreeting();
    }
}

Ответы [ 2 ]

6 голосов
/ 23 октября 2011

Ваша нынешняя практика написания элементов управления лучше, чем вы предлагаете.Вы хотите иметь возможность внедрять через поля, а не конструктор.Это плохая идея, и она не рекомендуется.

Цитата из Ninject wiki :

"Несмотря на то, что его простота заманчива, обычно следует избегать использования инъекции поля, так как значение может быть толькоустанавливается через Ninject. Это делает модульное тестирование намного более сложным, поскольку иногда проще всего использовать ручное внедрение зависимостей для внедрения фиктивных объектов в ваши модульные тесты. (Модульное тестирование с помощью Ninject более подробно рассматривается позже.) "

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

5 голосов
/ 23 октября 2011
public class HomeController : Controller
{
    private IHelloService _service;

    /*
          No default constructor
    */

    public string Index()
    {
        _service= DependencyResolver.Current.GetService<IHelloService>();
        return _service.GetGreeting();
    }
}

Хотя я бы серьезно усомнился в необходимости сделать это.

...