unity.mvc4:如何获得参考

时间:2013-09-04 13:44:59

标签: asp.net-mvc c#-4.0 inversion-of-control unity-container

我在我的MVC应用程序的Bootstrapper.cs中设置了Unity,所有这些都适用于我的控制器上的构造函数注入......

我的问题是,当我在控制器中的ActionResult中时,我需要获取对先前在Bootstrapper.cs中创建的容器的引用,以便我可以使用它来为我解析类。

e.g:

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

1 个答案:

答案 0 :(得分: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容器可以注入控制器构造函数的依赖项。

接下来你应该做的就是让视图做任何工作并使它们依赖于你的服务。视图应该是愚蠢的,除了从控制器映射它们的数据并将它们转换为HTML(或JSON或其他)之外什么都不做。

换句话说,请勿将testService传递给视图。从视图中调用testService会隐藏该逻辑,使视图更复杂,并使系统难以测试。由于您使用的是ITestService抽象,我假设您希望能够测试您的代码,但测试视图并不容易(或者至少,不像测试控制器那么容易)。

您应该做的是让控制器调用testService并收集视图所需的数据。然后将该数据(可能在单个类中组合,视图模型)传递给视图。