您的位置:首页 > 理论基础 > 计算机网络

Unity&WebForm(1): 自定义IHttpHandlerFactory使用Unity对ASP.NET Webform页面进行依赖注入

2008-06-10 21:00 816 查看

背景

在日常的开发中,特别是使用了多层结构的程序,在视图层的页面逻辑中时常会用到业务逻辑的对象,此时就有可能产生如下的代码

public partial class Default : System.Web.UI.Page

public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)

public void ReleaseHandler(IHttpHandler handler)

private static IHttpHandlerFactory CreatePageFactory()

private static IHttpHandler Build(IHttpHandler page)

private static readonly IUnityContainer unityContainer;

static UnityHttpHandlerFactory()

<unity>

<typeAliases>

<typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity"/>

</typeAliases>

<containers>

<container name="HttpHandlerContainer">

<types>

<!-- Default页面的依赖 -->

<type type="GDev.Test.WebApp.Default, GDev.Test.WebApp" mapTo="GDev.Test.WebApp.Default, GDev.Test.WebApp">

<lifetime type="singleton" />

<typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement, Microsoft.Practices.Unity.Configuration">

<property name="UserService" propertyType="GDev.Test.WebApp.IUser, GDev.Test.WebApp">

<dependency />

</property>

</typeConfig>

</type>

<type type="GDev.Test.WebApp.IUser, GDev.Test.WebApp" mapTo="GDev.Test.WebApp.MyUser, GDev.Test.WebApp">

<lifetime type="singleton" />

</type>

</types>

</container>

</containers>

</unity>

最后的工作当然是将此HttpHandlerFactory加入运行环境,在web.config中system.web配置组下的httpHandlers段加入以下2行即可

<remove verb="*" path="*.aspx"/>

<add verb="*" path="*.aspx" type="Cst.Core.Web.Factory.UnityHttpHandlerFactory, Cst.Core.Web"/>
这2行将原有的默认HttpHandlerFactory(即PageHandlerFactory)取消,代替以新的UnityHttpHandlerFactory

为了演示具体的效果,在Default的Page_Load方法中加入代码,使方法最终如下

protected void Page_Load(object sender, EventArgs e)

{

{

Response.Write("注入成功!");

}

}

结果当然是如预期地显示出了"注入成功"字样,也就不放图了~

问题

1.因为在Unity中注册的页面其实只是用来作为BuildUp的参考,所以其生命周期管理是Transient好还是Singleton好依旧是个问题,有待更详细的测试

2.Unity只提供对public的属性的注入,需要对protected属性注入还要自己写扩展

3.只能用属性注入,因为Page的构造是由PageHandlerFactory完成的,Unity无力拦截构造函数的注入

总结

本文提供了一种思路,使用HttpHandlerFactory对ASP.NET Webform的页面进行依赖注入,不仅仅是Unity,使用同样的思路也可以用Spring.NET或者Castle进行依赖注入,同样,也可以配合使用PIAB完成更多的功能

最后题外话:哪位老师有Unity的扩展方面的相关教程的请告诉我一下,特别是Inject方面的扩展(比如通过从Session或者QueryString取对象),万分感谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐