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中取值注入页面
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属性等待注入,其运行结果自然是显示了"注入成功",也就不再截图了
2.当然也可以有QueryStringLifetimeManager,不过这就更麻烦了,因为QueryString的值是string类型,要转换到其他类型还需要一个TypeConverter,一个可行的解决方案是在配置文件中的value项以一种约定的方式加入TypeConverter的类型,比如value="key&TypeConverterType"
背景
在很多情况下,会有较为持久地保存对象的需求,但由于对象的类度太细,也许不会考虑使用数据库,此时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实现页面流程的控制,这将是下一次话题。相关文章推荐
- Unity&Webform(2):自定义LifetimeManager和TypeConverter使Unity从HttpContext中取值注入WebForm页面 (转)
- Unity&WebForm(1): 自定义IHttpHandlerFactory使用Unity对ASP.NET Webform页面进行依赖注入
- 基于自定义Unity生存期模型PerCallContextLifeTimeManager的问题
- 自定义Unity生存期模型PerCallContextLifeTimeManager
- [导入]自定义IHttpHandlerFactory使用Unity对ASP.NET Webform页面进行依赖注入
- 基于自定义Unity生存期模型PerCallContextLifeTimeManager的问题
- WebForm.aspx 页面通过 AJAX 访问WebForm.aspx.cs类中的方法,获取数据(转)
- WebForm.aspx 页面通过 AJAX 访问WebForm.aspx.cs类中的方法,获取数据(转)
- sharepoint 2010 用contenttype自定义表单显示页面 custom displayForm page by contenttype
- C#中HttpWebRequest用Post提交Content-Type: multipart/form-data; boundary=
- WebForm.aspx 页面通过 AJAX 访问WebForm.aspx.cs类中的方法,获取数据
- jax-rs(Java API for RESTful Web Services) 实践教程 之四 —— @Context注入HttpServletRequest 使REST保持状态!
- 自定义IHttpHandlerFactory使用Unity对ASP.NET Webform页面进行依赖注入
- 自定义IHttpHandlerFactory使用Unity对ASP.NET Webform页面进行依赖注入 (转)
- 如何正确的为web.config编写http error code的自定义页面
- C#中HttpWebRequest用Post提交Content-Type: multipart/form-data;
- 利用XMLFormView在Web部件页中或者自定义页面中嵌入Infopath表单
- 文件上传 content-type:application/json System.Web.HttpContext.Current.Request.InputStream 读取不到数据
- HttpWebRequest 获取页面
- System.Web.HttpContext.Server.MapPath()