惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
B
Blog RSS Feed
美团技术团队
博客园 - 【当耐特】
C
Check Point Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
M
MIT News - Artificial intelligence
aimingoo的专栏
aimingoo的专栏
J
Java Code Geeks
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 司徒正美
T
Tailwind CSS Blog
Last Week in AI
Last Week in AI
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
人人都是产品经理
人人都是产品经理
N
Netflix TechBlog - Medium
Vercel News
Vercel News
P
Proofpoint News Feed
IT之家
IT之家
I
InfoQ
腾讯CDC
H
Hackread – Cybersecurity News, Data Breaches, AI and More

博客园 - 福娃

Ubuntu 16.04 LTS更新 程序员如何走出迷茫的困境? PHP vs Python Apache2.4中开通HTTP基本认证 NPM 与 left-pad 事件:我们是不是早已忘记该如何好好地编程? Groovy split竖杆注意 使用Flask-Migrate进行管理数据库升级 Fabric自动部署太方便了 程序员的复仇:11行代码如何让Node.js社区鸡飞狗跳 CAS认证原理图 grails 私有库相关设置 A successful Git branching model String to Date 多种格式转换 IBatis.Net如何支持多个数据库 [django]the story about Django and TurboGears [django]newforms两种方式示例 Since NHibernate 1.2.0, objects are lazy by default - 福娃 [Castle]Castle.Model被Castle.Core代替了 [Castle]Castle也范型 - 福娃 - 博客园
[Castle]Asp.Net中获取Castle容器中的服务的另一方法
福娃 · 2006-12-11 · via 博客园 - 福娃

我们知道在我们使用Castle IOC的时候,若你的类库在容器中的时候,你只需要通过公开属性或构造时设置参数后,Castle容器就会自动的根据配置文件中的服务为您实例化相应的类。但他并不支持Asp.Net的后置代码类。那么在Asp.Net中应如何获取容器中的服务呢?
我们可以通过如下方式:

IWindsorContainer container = ContainerAccessorUtil.GetContainer();
UserManage um 
= (UserManage)container["usermanage"];

其中usermanage就是配置文件中的component的ID.
我曾通过这个方式写了一个页面基类,页面继承该类后,就可以通过公开属性的方式来得到服务。

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;

        }


你也可以看 自由、创新、研究、探索…… 的博客上也有相应的介绍:在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);
            }

        }

    }


这样在我们的后置代码类中就可以通过公开属性的方式来获取容器中的服务。