如何使用依赖注入和存储库模式与ASP.NET Web服务?

时间:2009-09-20 00:07:30

标签: asp.net web-services dependency-injection inversion-of-control

使用常规ASP.NET MVC页面,存储库将传递给控件的构造函数。然后测试可以实例化传入模拟存储库的控制器。

如何使用网络服务执行此操作?我看到的问题是我们没有相应的ControllerBuilder.SetControllerFactory。

使用正确的存储库实现让我的IoC框架(Castle)实例化我的Web服务有哪些最佳实践?

我认为可能有一种方法可以扩展HttpHandler并改变Web服务实际实例化的方式。我相信这就是MVC框架的作用。

6 个答案:

答案 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)

答案 5 :(得分:0)