对于常规的ASP.NET MVC页面,存储库被传递给控件的构造函数。然后,测试可以实例化传入模拟存储库的控制器。
我如何使用web服务做到这一点?我看到的问题是我们没有ControllerBuilder.SetControllerFactory的等价物。
让我的IoC框架(Castle)用正确的存储库实现实例化我的web服务的最佳实践是什么?
我想也许有一种方法可以扩展HttpHandler并改变web服务实际实例化的方式。我相信MVC框架就是这样做的。
发布于 2009-09-24 23:21:26
我相信你正在寻找城堡温莎WCF集成设施。它提供了一个ServiceHost实现,利用Windsor IOC接管服务实现的构造过程。您可以像使用此工具的任何其他IoC应用程序一样注入依赖项,而且非常方便,它是Castle项目的一部分:
http://www.castleproject.org/container/facilities/trunk/wcf/index.html
如果Castle Project版本不能满足您的需要,我有自己的工具,在找到Castle项目版本之前,我为Windsor创建了这个工具来做同样的事情。它们通常做相同的事情,但两者处理问题的方式也略有不同。
发布于 2009-09-20 07:07:00
这是一个好问题。我也有同样的问题。我认为,如果您使用.asmx文件创建web服务,则不可能使用构造函数注入。如果您使用WCF来实现web服务,那么我认为这是可能的。
在我的.asmx web服务中,我让DI容器通过设置属性来设置依赖项。因为我的应用程序也是一个web表单asp.net应用程序,所以我必须这样做,因为我也不能在web表单上使用构造函数注入。但我使用的是StructureMap,它有一个BuildUp函数,可以设置已经创建的对象的属性。不像构造函数注入那样干净,但这是一个很好的折衷方法。
但是web服务本身与web表单不同,因为我可以将构建放在web表单之外的Application_PostMapRequestHandler事件中。但是我还没有发现在创建web服务类之后触发的事件。因此,在我的web服务的构造函数中,我有以下代码
ObjectFactory.BuildUp(this);这是一种反模式。由DI容器初始化的类不应该知道DI容器本身。但我还没有找到更好的解决方案。
发布于 2009-09-23 17:13:16
定义一个基类并在其中使用属性注入。皮特已经说过了,但你会这么做:ObjectFactory.BuildUp(这个);
不同之处在于,我会将它放在web服务的基类中,因此对于特定的实现来说,它是“自动的”。
这样只有一行代码,所以我不会关心它,除非你有明确的需要在运行时切换DI容器(不太可能)。如果您仍然需要这样做,只需将调用移动到将使用特定DI容器的单独类。
https://stackoverflow.com/questions/1449870
复制相似问题