我如何使用统一注入一些通用的asp net http处理程序

时间:2015-10-17 17:31:02

标签: c# asp.net inversion-of-control unity-container

这是this的重复,但解决方案使用了来自MVC的DependencyResolver,而我正在使用ASP.NEt Web表单。

那么我们如何才能在网络形式中为统一3做同样的事情

1 个答案:

答案 0 :(得分:0)

在我看来,我们将不得不为Http Handler提供另一个Composition Root。我说"另一个"因为您的第一个组合根用于ASP.NET Web窗体应用程序。

通常,单个应用程序应该只有一个组合根。但是,框架限制有时会迫使我们有多个。

我们将通过拥有自己的Http Handler Factory创建一个新的Composition Root。即,一个实现IHttpHandlerFactory的类。

考虑这个例子。您有以下服务和依赖它的处理程序(通过构造函数注入):

public interface IService
{
    string GetSomething();
}

public class Service : IService
{
    public string GetSomething()
    {
        return "Something nice";
    }
}

public class MyHandler : IHttpHandler
{
    private readonly IService m_Service;

    public MyHandler(IService service)
    {
        m_Service = service;
    }

    public void ProcessRequest(HttpContext context)
    {
        HttpRequest request = context.Request;
        HttpResponse response = context.Response;

        response.Write("<html>");
        response.Write("<body>");
        response.Write(string.Format("From handler 1: <h2>{0}</h2>", m_Service.GetSomething()));
        response.Write("</body>");
        response.Write("</html>");
    }

    public bool IsReusable { get; private set; }
}

我们将创建以下处理程序工厂:

public class HandlerFactory : IHttpHandlerFactory
{
    private readonly UnityContainer m_Container;

    public HandlerFactory()
    {
        m_Container = new UnityContainer();
        m_Container.RegisterType<IService, Service>();
    }

    public IHttpHandler GetHandler(HttpContext context, string request_type, string url, string path_translated)
    {
        if (url.EndsWith(".ext1"))
            return m_Container.Resolve<MyHandler>();

        //Here for other cases, we can resolve other handlers

        return null;
    }

    public void ReleaseHandler(IHttpHandler handler)
    {
        //Here we should use the container to release the handler. However, unity seems to be missing this feature
    }
}

此处理程序充当合成根。当它收到创建处理程序的请求时,基于某些逻辑(在我的情况下基于请求文件扩展名),它会创建适当的处理程序。你可以在这里拥有自己的逻辑。

要告诉ASP.NET框架有关工厂的信息,我们需要在web.config中注册处理程序,如下所示:

<system.webServer>
  <handlers>
    <add name="HandlerFactory" verb="*" path="Custom/*" type="WebApplication1.HandlerFactory" />
  </handlers>
</system.webServer>

WebApplication1是工厂存在的命名空间。

我使用Custom/*作为路径。这意味着/Custom/*格式的任何请求都将使用工厂提供。你可以在这里找到自己的路径。