我正在构建一个ASP MVC 3应用程序,我在其中使用Unity作为IOC容器,并在DependencyResolver上注册它。在我的控制器中,我可以这样做:
DependencyResolver.Current.GetService(GetType(IViewAllPersonsHandler))
然后当我编写单元测试时,我在测试中重新定义了我的映射以使用模拟对象。
我的一位同事告诉我,这样做被视为反模式。
有谁能告诉我这是否是这样的,为什么?
我知道通常我应该在构造函数中注入我的依赖项,但随着我的控制器的增长,构造函数参数会变得很长。
THX
答案 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));