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

推荐订阅源

T
Tailwind CSS Blog
C
CERT Recently Published Vulnerability Notes
P
Proofpoint News Feed
Vercel News
Vercel News
博客园 - 三生石上(FineUI控件)
IT之家
IT之家
Help Net Security
Help Net Security
月光博客
月光博客
N
News and Events Feed by Topic
Cloudbric
Cloudbric
博客园 - 司徒正美
L
LangChain Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tenable Blog
The Register - Security
The Register - Security
The Hacker News
The Hacker News
I
InfoQ
The Last Watchdog
The Last Watchdog
MyScale Blog
MyScale Blog
Schneier on Security
Schneier on Security
WordPress大学
WordPress大学
小众软件
小众软件
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
宝玉的分享
宝玉的分享
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
K
Kaspersky official blog
L
LINUX DO - 热门话题
N
News | PayPal Newsroom
F
Fortinet All Blogs
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Security @ Cisco Blogs
Recorded Future
Recorded Future
大猫的无限游戏
大猫的无限游戏
H
Help Net Security
Google Online Security Blog
Google Online Security Blog
S
Schneier on Security
C
Cisco Blogs
N
News and Events Feed by Topic
V2EX - 技术
V2EX - 技术
Latest news
Latest news
PCI Perspectives
PCI Perspectives
T
The Blog of Author Tim Ferriss
P
Palo Alto Networks Blog
T
Tor Project blog
Project Zero
Project Zero
云风的 BLOG
云风的 BLOG
Webroot Blog
Webroot Blog
Attack and Defense Labs
Attack and Defense Labs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org

博客园 - 福娃

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);
            }

        }

    }


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