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

问题描述 投票:0回答:6

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

我如何使用网络服务来做到这一点?我看到的问题是我们没有相当于 ControllerBuilder.SetControllerFactory 的东西。

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

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

asp.net web-services dependency-injection inversion-of-control
6个回答
2
投票

我认为,如果您使用

.asmx
文件创建 Web 服务,则不可能使用构造函数注入。如果您使用 WCF 来实现 Web 服务,那么我认为这是可能的。

在我的

.asmx
Web 服务中,我让 DI 容器通过设置属性来设置依赖项。由于我的应用程序也是一个 Web 表单 ASP.NET 应用程序,因此我必须这样做,因为我也无法在 Web 表单上使用构造函数注入。但我使用的是 StructureMap,它有一个
BuildUp
函数,可以设置已创建对象的属性。不像构造函数注入那么干净,但一个很好的折衷方案。

但是 Web 服务与 Web 表单不同,因为我可以将

buildup
放置在 Web 表单之外的
Application_PostMapRequestHandler
事件中。但我还没有发现Web服务类创建后触发的事件。因此,在我的网络服务的构造函数中,我有以下代码

ObjectFactory.BuildUp(this);

这是一种反模式。由 DI 容器初始化的类不应该知道 DI 容器本身。但我还没有找到更好的解决方案。


1
投票

我相信您正在寻找温莎城堡 WCF 集成设施。它提供了一个 ServiceHost 实现,利用 Windsor IOC 接管服务实现的构建过程。您可以使用此工具像任何其他 IoC 应用程序一样注入依赖项,并且很方便,它是 Castle 项目的一部分:

http://www.castleproject.org/container/facilities/trunk/wcf/index.html

如果 Castle 项目版本不能满足您的需要,我有自己的工具,在找到 Castle 项目版本之前,我创建了该工具来为 Windsor 执行相同的操作。他们通常做同样的事情,但处理问题的方式也略有不同。


0
投票

定义一个基类并在其中使用属性注入。皮特已经说过了,但你会这样做:ObjectFactory.BuildUp(this);

不同之处在于,我会将其放在 Web 服务的基类上,因此对于特定实现来说它是“自动”的。

这样就只有一行,所以我不会关心它,除非你明确需要在运行时切换 DI 容器(不太可能)。如果您仍然需要,只需将调用移至将使用特定 DI 容器的单独类即可。


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>();
  }
}

0
投票

0
投票

MS 实际上对此有一个解决方案:http://msdn.microsoft.com/en-us/library/ff664461(PandP.50).aspx

© www.soinside.com 2019 - 2024. All rights reserved.