【问题标题】:Construtor/Setter Injection using IoC in HttpHandler, is it possible?在 HttpHandler 中使用 IoC 进行构造函数/设置器注入,这可能吗?
【发布时间】:2011-03-31 22:29:08
【问题描述】:

我遇到了一个相当棘手的问题。可能有一个简单的解决方案,但我找不到!

我有一个自定义的 HttpHandler,我想处理一个请求,记录某些信息,然后在数据库中输入详细信息。我正在使用 NUnit 和 Castle Windsor。

所以我有两个接口;一个用于记录另一个用于数据输入,它们是构造函数注入的。我很快发现没有办法调用构造函数,因为总是调用默认的无参数构造函数。

所以我想我会使用 Setter 注入并让 Castle windsor 解决它。这实际上在我使用container.Resolve<CustomHttpHandler>(); 时起作用,我可以检查记录器是否不为空。 (在 Global.asax.cs 的 Application_Start 中)

问题是虽然 Castle Windsor 可以创建 http 应用程序没有使用的实例???我想??

基本上,这样做的全部原因是能够通过模拟和单元测试隔离地测试记录器和数据存储库代码。

有什么想法可以解决这个问题吗?

谢谢!

【问题讨论】:

  • 马特,这样改变你的问题并不酷,因为你使所有现有的答案无效,你强迫每个人更新。请恢复您的编辑并创建一个新问题。
  • 嗨毛里西奥。抱歉,显然我不知道这是如何工作的。已恢复并创建了一个新问题。谢谢!

标签: dependency-injection mocking castle-windsor ioc-container httphandler


【解决方案1】:

不可能,至少不能直接。 IHttpHandler 对象由 ASP.NET 运行时实例化,它不允许 Windsor 参与其创建。您可以:

  • 通过将容器用作服务定位器来拉取依赖项。
  • 设置一个基本处理程序,用于创建、注入和委托给您自己的处理程序(请参阅Spring does it 如何)
  • 将容器用作处理整个请求的另一个服务的服务定位器(如saret explained

【讨论】:

  • 当,我感觉可能是这样。您能否解释一下您的第一点:通过使用容器作为服务定位器来拉取依赖项。?谢谢!
  • @Matt:从您的 HttpHandler 调用容器以获取您需要的任何依赖项。
  • 感谢毛里西奥的回复。明白了!
  • 嗨毛里西奥。我已经更新了我的帖子,如果你有时间可以看看会很棒。谢谢!
【解决方案2】:

您可以做的是让 HttpHandler 调用另一个实际处理请求的对象。所以在你的 HttpHandler 的 ProcessRequest 方法中你会做这样的事情:

public void ProcessRequest(HttpContext context)
{
 var myHandlerObject = container.Resolve<HandlerObject>();
 myHandlerObject.ProcessRequest(context or some state/info that is required)
}

【讨论】:

  • 嗨。谢谢你的主意。这可能是解决方案,毛里西奥的其他选择之一。谢谢!
猜你喜欢
  • 1970-01-01
  • 2022-07-29
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
相关资源
最近更新 更多