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

Unity&Webform(2):自定义LifetimeManager和TypeConverter使Unity从HttpContext中取值注入WebForm页面

2008-06-11 10:38 453 查看
上一篇Unity&WebForm(1): 自定义IHttpHandlerFactory使用Unity对ASP.NET Webform页面进行依赖注入中让Unity和WebForm结合在一起,通过使用HttpHandlerFactory实现了对页面的依赖注入,本文将在上篇的基础上,通过对Unity的LifetimeManager的扩展实现从WEB Application特有的HttpContext中取值注入页面

背景

在很多情况下,会有较为持久地保存对象的需求,但由于对象的类度太细,也许不会考虑使用数据库,此时HttpContext的Items属性是一个很好的归宿,而在某些页面,则需要从HttpContext中获得此类对象,一个比较普遍的做法是使用属性进行封装,代码如下

public UserInfo CurrentUser

public abstract class LifetimeManager : ILifetimePolicy, IBuilderPolicy

public class ContextLifetimeManager : LifetimeManager

public class ContextLifetimeManagerConverter : TypeConverter

<unity>

<typeAliases>

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

<!-- 自定义的LifetimeManager的另名 -->

<typeAlias alias="context" type="GDev.Test.WebApp.Unity.ContextLifetimeManager, GDev.Test.WebApp"/>

</typeAliases>

<containers>

<container name="HttpHandlerContainer">

<types>

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

<!-- 使用自定义的ContextLifetimeManager,并利用typeConverter将key通过value传入 -->

<lifetime type="context"

value="CurrentUser"

typeConverter="GDev.Test.WebApp.Unity.ContextLifetimeManagerConverter, GDev.Test.WebApp" />

</type>

<!-- 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="CurrentUser" propertyType="GDev.Test.WebApp.UserInfo, GDev.Test.WebApp">

<dependency />

</property>

</typeConfig>

</type>

</types>

</container>

</containers>

</unity>
此处的键值为CurrentUser,向Default页面进行了注入

为了演示,修改Default页面的代码如下

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

{

{

{

{

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

}

}

}
在页面中有一个CurrentUser属性等待注入,其运行结果自然是显示了"注入成功",也就不再截图了

扩展

1.同样可以自定义SessionLifetimeManager,但需要注意的是不可以在HttpHandlerFactory中使用Session,因此要将BuildUp的时机放到页面的PreInit事件中,另外还需要注意的是,如果你将Unity和PIAB一起用,那么在页面的PreInit中使用container.BuildUp(GetType().BaseType, this);并无法提供PIAB的策略注入机制,其原因是PIAB的注入会返回一个全新的对象,而在些单纯地使用BuidUp仅仅是将this对象包装了起来

2.当然也可以有QueryStringLifetimeManager,不过这就更麻烦了,因为QueryString的值是string类型,要转换到其他类型还需要一个TypeConverter,一个可行的解决方案是在配置文件中的value项以一种约定的方式加入TypeConverter的类型,比如value="key&TypeConverterType"

总结

本文提供了对Unity的一种扩展的思路,本次扩展针对对象生命周期管理的环节,使其与WebForm更好地进行结合,事实上,如果愿意使用一个页面总基类并在页面的生命周期开始时再进行注入的话,还可以通过扩展BuilderExtension实现页面流程的控制,这将是下一次话题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐