这是this的重复,但解决方案使用了来自MVC的DependencyResolver,而我正在使用ASP.NEt Web表单。
那么我们如何才能在网络形式中为统一3做同样的事情
答案 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/*
格式的任何请求都将使用工厂提供。你可以在这里找到自己的路径。