1

我已经在我的 MVC 应用程序的 Bootstrapper.cs 中设置了 Unity,一切都适用于我的控制器上的构造函数注入......

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

例如:

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

1 回答 1

1

我需要获取对容器的引用

不,你没有。您永远不需要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 集成包进行统一,因此您可能DependencyResolver在应用程序的启动路径中注册了特定于 Unity 的内容。看起来很像这样:

DependencyResolver.SetResolver(new UnityDependencyResolver(container));

完成此操作后,您的自定义DependencyResolver会将控制器的创建委托给 Unity 容器,并且 Unity 容器能够注入控制器构造函数的依赖关系。

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

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

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

于 2013-09-04T13:57:55.047 回答