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

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & 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);
            }

        }

    }


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