我在我的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);
}
答案 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
并收集视图所需的数据。然后将该数据(可能在单个类中组合,视图模型)传递给视图。