使用常规ASP.NET MVC页面,存储库将传递给控件的构造函数。然后测试可以实例化传入模拟存储库的控制器。
如何使用网络服务执行此操作?我看到的问题是我们没有相应的ControllerBuilder.SetControllerFactory。
使用正确的存储库实现让我的IoC框架(Castle)实例化我的Web服务有哪些最佳实践?
我认为可能有一种方法可以扩展HttpHandler并改变Web服务实际实例化的方式。我相信这就是MVC框架的作用。
答案 0 :(得分:2)
这是一个很好的问题。我也有同样的问题。我认为如果您使用.asmx文件创建Web服务,则无法使用构造函数注入。如果您使用WCF来实现Web服务,那么我认为这是可能的。
在我的.asmx Web服务中,我让DI容器通过设置属性来设置依赖项。由于我的应用程序也是一个Web表单asp.net应用程序,而不是我必须这样做,因为我也不能在Web表单上使用构造函数注入。但我正在使用StructureMap,它有一个BuildUp
函数,可以设置已创建对象的属性。不像构造函数注入那么干净,但是很好的妥协。
但是,Web服务可以将自己与Web表单区分开来,因为我可以在Application_PostMapRequestHandler
事件中将构建置于Web表单之外。但是我没有发现在创建Web服务类之后触发的事件。因此,在我的Web服务的构造函数中,我有以下代码
ObjectFactory.BuildUp(this);
这是一种反模式。由DI容器初始化的类不应该知道DI容器本身。但我还没有找到更好的解决方案。
答案 1 :(得分:1)
我相信您正在寻找Castle Windsor WCF集成设施。它提供了一个ServiceHost实现,它利用Windsor IOC接管服务实现的构建过程。您可以使用此工具注入依赖项,就像使用此工具一样,并且足够方便,它是Castle项目的一部分:
http://www.castleproject.org/container/facilities/trunk/wcf/index.html
如果Castle Project版本没有按照你的需要去做,我有自己的工具,我为Windsor做了同样的事情,然后才发现Castle项目的版本。它们通常都做同样的事情,但两者也会稍微不同地解决问题。
答案 2 :(得分:0)
定义一个基类并在那里使用属性注入。皮特已经说过了,但你会这样做:ObjectFactory.BuildUp(this);
不同之处在于我会将它放在Web服务的基类上,因此它对于特定的实现是“自动的”。
这就是它的一行,所以我不关心它,除非你明确需要在运行时切换DI容器(不太可能)。如果您仍然需要,只需将调用移动到使用特定DI容器的单独类。
答案 3 :(得分:0)
是否有任何理由无法使用所需的构造函数创建自定义类,然后在asmx中实例化该类的对象,然后将所有操作委托给该对象?
我通常会创建这样的对象:
var o = CustomClass.Create();
public class CustomClass
{
public static CustomClass Create()
{
return IoC.Resolve<CustomClass>();
}
}
public static class IoC
{
public T Resolve<T>()
{
return yourStaticReferenceToPreferredContainer.Resolve<T>();
}
}
答案 4 :(得分:0)
您创建了哪种类型的服务?如果您使用WCF我写了这个:
答案 5 :(得分:0)