C# 用于单元测试的带UnityContainer的ASP MVC依赖解析程序

C# 用于单元测试的带UnityContainer的ASP MVC依赖解析程序,c#,asp.net-mvc-3,unity-container,C#,Asp.net Mvc 3,Unity Container,我正在构建一个ASP MVC 3应用程序,其中我使用Unity作为IOC容器,并在DependencyResolver上注册它。在控制器中,我可以执行以下操作: DependencyResolver.Current.GetService(GetType(IViewAllPersonsHandler)) 然后,当我编写单元测试时,我在测试中重新定义映射以使用模拟对象 我的一位同事告诉我,这样做被认为是一种反模式 有人能告诉我情况是否如此以及原因吗 我知道通常我应该在构造函数中注入依赖项,但是随着

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

DependencyResolver.Current.GetService(GetType(IViewAllPersonsHandler))
然后,当我编写单元测试时,我在测试中重新定义映射以使用模拟对象

我的一位同事告诉我,这样做被认为是一种反模式

有人能告诉我情况是否如此以及原因吗

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


THX

< P>大多数人认为服务定位器模式是一种反模式。可能是因为你可以用一些腿部运动来解决这个问题

如果您这样做是为了限制构造函数参数,那么可以尝试其他方法。我使用属性注入。因为我使用castle windsor,所以默认情况下容器会注入公共属性。上一次我看到Unity没有这样做,你必须使用一些扩展来让它工作

除此之外,您还可以拆分控制器或将其委托给操作中的任务

但我也会远离你们控制器中的服务定位器


Hth

< P>大多数人认为服务定位器模式是一种反模式。可能是因为你可以用一些腿部运动来解决这个问题

如果您这样做是为了限制构造函数参数,那么可以尝试其他方法。我使用属性注入。因为我使用castle windsor,所以默认情况下容器会注入公共属性。上一次我看到Unity没有这样做,你必须使用一些扩展来让它工作

除此之外,您还可以拆分控制器或将其委托给操作中的任务

但我也会远离你们控制器中的服务定位器


HTH

您可以使用System.Web.Mvc.dependencysolver.SetResolver(resolvedependencymock)

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

最低起订量很容易:

DependencyResolver.SetResolver(Mock.Of<IServiceLocator>(s => s.GetInstance(It.IsAny<Type>()) == cacheMock.Object));
DependencyResolver.SetResolver(Mock.Of(s=>s.GetInstance(It.IsAny())==cacheMock.Object));
最低起订量很简单:

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

我读过这篇关于它的博客;如果我使用属性注入,那么这有什么不同,因为我仍然需要知道控制器上的某个操作使用了哪些依赖项。它将问题最小化,但不会使其消失,如果我错了,请纠正我。依赖项不会消失,但对容器的依赖会消失。@Eben Unity默认情况下不进行属性注入,但不需要任何扩展,它使用属性来装饰要注入的属性。@frennky---啊!unity可能不需要扩展,但如果内存可用,则有一个可用扩展,因此不需要使用属性。我不太喜欢这些属性:)看了大约18个月前,但看起来像是你自己做的:)---我读了这篇关于它的博客;如果我使用属性注入,那么这有什么不同,因为我仍然需要知道控制器上的某个操作使用了哪些依赖项。它将问题最小化,但不会使其消失,如果我错了,请纠正我。依赖项不会消失,但对容器的依赖会消失。@Eben Unity默认情况下不进行属性注入,但不需要任何扩展,它使用属性来装饰要注入的属性。@frennky---啊!unity可能不需要扩展,但如果内存可用,则有一个可用扩展,因此不需要使用属性。我不太喜欢这些属性:)大约18个月前看过,但看起来像是你自己做的:)---你不应该从你的控制器调用DependencyResolver,坚持构造函数注入。你的控制器似乎做了太多的事情。您是否可以将一些依赖项移动到其他层,甚至可能是过滤器或拆分控制器。我使用CQS体系结构,因此对于每个操作,我都有一个单独的处理程序或命令(例如:UpdatePersonBankCommand、UpdatePersonAddressCommand,…)。我将尝试看看是否可以拆分控制器,但我不确定是否可以。您不应该从控制器调用DependencyResolver,请坚持构造函数注入。你的控制器似乎做了太多的事情。您是否可以将一些依赖项移动到其他层,甚至可能是过滤器或拆分控制器。我使用CQS体系结构,因此对于每个操作,我都有一个单独的处理程序或命令(例如:UpdatePersonBankCommand、UpdatePersonAddressCommand,…)。我会试试看是否可以拆分控制器,但我不确定是否可以。您能提供更多详细信息吗?我需要什么?完整的示例是什么样子的?因为只有这些信息我无法让它工作。。。谢谢你能提供更多的细节吗?我需要什么?完整的示例是什么样子的?因为只有这些信息我无法让它工作。。。谢谢