[Castle]Asp.Net中获取Castle容器中的服务的另一方法
我们知道在我们使用Castle IOC的时候,若你的类库在容器中的时候,你只需要通过公开属性或构造时设置参数后,Castle容器就会自动的根据配置文件中的服务为您实例化相应的类。但他并不支持Asp.Net的后置代码类。那么在Asp.Net中应如何获取容器中的服务呢?
我们可以通过如下方式:
我曾通过这个方式写了一个页面基类,页面继承该类后,就可以通过公开属性的方式来得到服务。
你也可以看 自由、创新、研究、探索…… 的博客上也有相应的介绍:在asp.net页面上得到Castle容器的实例 。
这是我以前的做法,今天所要讲的是另一种使用方式,通过HttpHandler的方式将每个页面的HttpHandler增加到Castle容器中。(以下代码来自互联网)
这样在我们的后置代码类中就可以通过公开属性的方式来获取容器中的服务。
我们可以通过如下方式:
IWindsorContainer container = ContainerAccessorUtil.GetContainer();
UserManage um = (UserManage)container["usermanage"];
其中usermanage就是配置文件中的component的ID.UserManage um = (UserManage)container["usermanage"];
我曾通过这个方式写了一个页面基类,页面继承该类后,就可以通过公开属性的方式来得到服务。
private BindingFlags BINDING_FLAGS_SET
= BindingFlags.Public
| BindingFlags.SetProperty
| BindingFlags.Instance
| BindingFlags.SetField
;
protected override void OnInit(EventArgs e)
{
//判断退出
if (IsCheckLogin== true && this.UserId == -1)
{
Response.Redirect("~/index.aspx");
}
IWindsorContainer container = ObtainContainer();
Type type = this.GetType();
PropertyInfo[] properties = type.GetProperties(BINDING_FLAGS_SET);
foreach (PropertyInfo propertie in properties)
{
string pname = propertie.Name;
if (container.Kernel.HasComponent(pname))
{
propertie.SetValue(this, container[pname], null);
}
}
base.OnInit(e);
}
public IWindsorContainer ObtainContainer()
{
IContainerAccessor containerAccessor =
HttpContext.Current.ApplicationInstance as IContainerAccessor;
if (containerAccessor == null)
{
throw new ApplicationException("你必须在HttpApplication中实现接口 IContainerAccessor 暴露容器的属性");
}
IWindsorContainer container = containerAccessor.Container;
if (container == null)
{
throw new ApplicationException("HttpApplication 得不到容器的实例");
}
return container;
}
= BindingFlags.Public
| BindingFlags.SetProperty
| BindingFlags.Instance
| BindingFlags.SetField
;
protected override void OnInit(EventArgs e)
{
//判断退出
if (IsCheckLogin== true && this.UserId == -1)
{
Response.Redirect("~/index.aspx");
}
IWindsorContainer container = ObtainContainer();
Type type = this.GetType();
PropertyInfo[] properties = type.GetProperties(BINDING_FLAGS_SET);
foreach (PropertyInfo propertie in properties)
{
string pname = propertie.Name;
if (container.Kernel.HasComponent(pname))
{
propertie.SetValue(this, container[pname], null);
}
}
base.OnInit(e);
}
public IWindsorContainer ObtainContainer()
{
IContainerAccessor containerAccessor =
HttpContext.Current.ApplicationInstance as IContainerAccessor;
if (containerAccessor == null)
{
throw new ApplicationException("你必须在HttpApplication中实现接口 IContainerAccessor 暴露容器的属性");
}
IWindsorContainer container = containerAccessor.Container;
if (container == null)
{
throw new ApplicationException("HttpApplication 得不到容器的实例");
}
return container;
}
你也可以看 自由、创新、研究、探索…… 的博客上也有相应的介绍:在asp.net页面上得到Castle容器的实例 。
这是我以前的做法,今天所要讲的是另一种使用方式,通过HttpHandler的方式将每个页面的HttpHandler增加到Castle容器中。(以下代码来自互联网)
public class PageHandler : IHttpHandler, IRequiresSessionState
{
private static readonly ILog log = LogManager.GetLogger(typeof(PageHandler));
IHttpHandler Members
private IHttpHandler RegisterAspxPage(IHttpHandler handler, HttpContext context)
{
if (handler is IRuixinPage)
{
string pageKey = Guid.NewGuid().ToString();
IWindsorContainer container = ContainerAccessorUtil.GetContainer();
container.Kernel.AddComponent(pageKey, handler.GetType());
if (container.Kernel.HasComponent(handler.GetType()))
{
IHttpHandler newHandler = (IHttpHandler)container[handler.GetType()];
handler = newHandler;
}
}
return handler;
}
private void RemoveAspxPage(IHttpHandler handler, HttpContext context)
{
if (handler is IRuixinPage)
{
IWindsorContainer container = (context.ApplicationInstance as IContainerAccessor).Container;
container.Release(handler);
}
}
}
{
private static readonly ILog log = LogManager.GetLogger(typeof(PageHandler));
IHttpHandler Members
private IHttpHandler RegisterAspxPage(IHttpHandler handler, HttpContext context)
{
if (handler is IRuixinPage)
{
string pageKey = Guid.NewGuid().ToString();
IWindsorContainer container = ContainerAccessorUtil.GetContainer();
container.Kernel.AddComponent(pageKey, handler.GetType());
if (container.Kernel.HasComponent(handler.GetType()))
{
IHttpHandler newHandler = (IHttpHandler)container[handler.GetType()];
handler = newHandler;
}
}
return handler;
}
private void RemoveAspxPage(IHttpHandler handler, HttpContext context)
{
if (handler is IRuixinPage)
{
IWindsorContainer container = (context.ApplicationInstance as IContainerAccessor).Container;
container.Release(handler);
}
}
}
这样在我们的后置代码类中就可以通过公开属性的方式来获取容器中的服务。