在HttpHandler中使用IoC的构造函数/ Setter注入,是否可能?

时间:2010-08-19 05:02:35

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

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

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

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

所以我想我会使用Setter注射器让Castle windsor对它进行排序。这实际上就像我使用container.Resolve<CustomHttpHandler>();时一样,我可以检查记录器是否为空。 (在Global.asax.cs中的Application_Start中)

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

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