我们知道在我们使用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#region IHttpHandler Members
/**//// <summary>
/// Process the aspx request. This means (eventually) rewriting the url and registering the page
/// in the container.
/// </summary>
/// <param name="context"></param>
public void ProcessRequest(HttpContext context)
{
string rawUrl = context.Request.RawUrl;
log.Info("Starting request for " + rawUrl);
DateTime startTime = DateTime.Now;
// Rewrite url
//UrlRewriter urlRewriter = new UrlRewriter(context);
//string rewrittenUrl = urlRewriter.RewriteUrl(rawUrl);
// Obtain the handler for the current page
string aspxPagePath = rawUrl.Substring(0, rawUrl.IndexOf(".aspx") + 5);
IHttpHandler handler = PageParser.GetCompiledPageInstance(aspxPagePath, null, context);
// Register the page in the container
handler = RegisterAspxPage(handler, context);
// Process the page just like any other aspx page
handler.ProcessRequest(context);
// Remove the page from the container
RemoveAspxPage(handler, context);
// Log duration
TimeSpan duration = DateTime.Now - startTime;
log.Info(String.Format("Request finshed. Total duration: {0} ms.", duration.Milliseconds));
}
/**//// <summary>
///
/// </summary>
public bool IsReusable
{
get { return true; }
}
#endregion
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#region IHttpHandler Members
/**//// <summary>
/// Process the aspx request. This means (eventually) rewriting the url and registering the page
/// in the container.
/// </summary>
/// <param name="context"></param>
public void ProcessRequest(HttpContext context)
{
string rawUrl = context.Request.RawUrl;
log.Info("Starting request for " + rawUrl);
DateTime startTime = DateTime.Now;
// Rewrite url
//UrlRewriter urlRewriter = new UrlRewriter(context);
//string rewrittenUrl = urlRewriter.RewriteUrl(rawUrl);
// Obtain the handler for the current page
string aspxPagePath = rawUrl.Substring(0, rawUrl.IndexOf(".aspx") + 5);
IHttpHandler handler = PageParser.GetCompiledPageInstance(aspxPagePath, null, context);
// Register the page in the container
handler = RegisterAspxPage(handler, context);
// Process the page just like any other aspx page
handler.ProcessRequest(context);
// Remove the page from the container
RemoveAspxPage(handler, context);
// Log duration
TimeSpan duration = DateTime.Now - startTime;
log.Info(String.Format("Request finshed. Total duration: {0} ms.", duration.Milliseconds));
}
/**//// <summary>
///
/// </summary>
public bool IsReusable
{
get { return true; }
}
#endregion
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);
}
}
}
这样在我们的后置代码类中就可以通过公开属性的方式来获取容器中的服务。