1

Я настройка Unity в Bootstrapper.cs моего приложения MVC, все хорошо работает для инъекций конструктора на моих контроллерах ...unity.mvc4: как получить ссылку

Мой вопрос, когда я в ActionResult внутри контроллера мне нужно получить ссылку на контейнер, который я ранее создал в Bootstrapper.cs, поэтому я могу использовать его для разрешения классов для меня.

например:

public ActionResult Index() 
{ 
    //-- container needs a reference to unity container 
    var testService = container.Resolve<ITestService>(); 
    return View(testService); 
} 

ответ

1

Мне нужно получить ссылку на контейнер

Нет, вы не делаете. Вы should never need to reference the container (или DependencyResolver) из вашей заявки.

Используйте конструктор инъекции вместо:

public class HomeController : Controller 
{ 
    private readonly ITestService testService; 

    // constructor 
    public HomeController(ITestService testService) 
    { 
     this.testService = testService; 
    } 

    public ActionResult Index() 
    { 
     return View(this.testService); 
    } 
} 

Поскольку вы используете пакет интеграции MVC3 единства, вы, вероятно, зарегистрирован Unity конкретных DependencyResolver в пути запуска приложения. Это выглядит так же, как это:

DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

Когда вы сделаете это, ваш обычай DependencyResolver будет делегировать создание контроллеров контейнера Unity и контейнер Unity способен вводить depdencies конструктора-х контроллеров.

Следующее, что вам никогда не нужно делать - это позволить взглядам делать какую-либо работу и делать их зависимыми от ваших услуг. Представления должны быть немыми и ничего не делать, как отображать данные, которые они получают от контроллера, и преобразовывать их в HTML (или JSON или что-то еще).

Другими словами, не переходите на testService к виду. Вызов testService из вида скрывает эту логику, делает просмотр более сложным и делает систему трудной для тестирования. Поскольку вы используете абстракцию ITestService, я предполагаю, что вы хотите проверить свой код, но тестирование представления непросто (или, по крайней мере, не так просто, как вы можете протестировать контроллер).

Что нужно сделать, позвольте контроллеру вызвать testService и собрать данные, необходимые для использования в режиме просмотра. Затем передайте эти данные (возможно, объединенные в один класс, модель представления) в представление.