使用UnityContainer进行单元测试的ASP MVC DependencyResolver

时间:2011-07-27 05:12:56

标签: c# asp.net-mvc-3 unity-container

我正在构建一个ASP MVC 3应用程序,我在其中使用Unity作为IOC容器,并在DependencyResolver上注册它。在我的控制器中,我可以这样做:

DependencyResolver.Current.GetService(GetType(IViewAllPersonsHandler))

然后当我编写单元测试时,我在测试中重新定义了我的映射以使用模拟对象。

我的一位同事告诉我,这样做被视为反模式。

有谁能告诉我这是否是这样的,为什么?

我知道通常我应该在构造函数中注入我的依赖项,但随着我的控制器的增长,构造函数参数会变得很长。

THX

3 个答案:

答案 0 :(得分:3)

大多数人认为服务定位器模式是反模式。可能是因为人们可以通过一些腿部工作来解决它。

如果你这样做是为了限制构造函数参数,你可以尝试不同的东西。我使用属性注入。由于我使用城堡windsor,容器默认注入公共属性。最后我看起来Unity没有这样做,你必须使用一些扩展才能使它工作。

除此之外,您可以将控制器或委托拆分为您的行动中的任务。

但我也会远离你控制器内的服务定位器。

HTH

答案 1 :(得分:1)

您可以使用System.Web.Mvc.DependencyResolver.SetResolver(resovlveDependencyMock);

答案 2 :(得分:0)

Moq很容易:

DependencyResolver.SetResolver(Mock.Of<IServiceLocator>(s => s.GetInstance(It.IsAny<Type>()) == cacheMock.Object));