参考:http://shanyou.cnblogs.com/archive/2005/10/28/264103.html
在项目中使用Castle IOC容器,可以在Asp.Net页面上这样得到Castle容器:
1. 在Global.asax.cs中实现IContainerAccessor
Global.asax
public
class
Global : System.Web.HttpApplication, IContainerAccessor
{
private
static
WindsorContainer container;
protected
void
Application_Start(
object
sender, EventArgs e)
{
//CacheManager.LoadCacheFile(); 缓存管理类
container
=
new
WindsorContainer(
new
XmlInterpreter(
new
ConfigResource()));
}
protected
void
Application_End(
object
sender, EventArgs e)
{
}
public
IWindsorContainer Container
{
get
{
return
container; }
}
}
2. 获取容器实例
ContainerAccessorUtil
public
class
ContainerAccessorUtil
{
private
ContainerAccessorUtil()
{
}
///
<summary>
///
获得容器里的所有实例
///
</summary>
///
<returns>
所有实例的List
</returns>
public
static
IWindsorContainer GetContainer()
{
IContainerAccessor containerAccessor
=
HttpContext.Current.ApplicationInstance
as
IContainerAccessor;
if
(containerAccessor
==
null
)
{
throw
new
Exception(
"
You must extend the HttpApplication in your web project
"
+
"
and implement the IContainerAccessor to properly expose your container instance
"
+
"
/n
"
+
"
你必须在HttpApplication中实现接口 IContainerAccessor 暴露容器的属性
"
);
}
IWindsorContainer container
=
containerAccessor.Container
as
IWindsorContainer;
if
(container
==
null
)
{
throw
new
Exception(
"
The container seems to be unavailable in
"
+
"
your HttpApplication subclass
"
+
"
/n
"
+
"
HttpApplication 得不到容器的实例
"
);
}
return
container;
}
}
3. 在具体页面的相关基类内,通过ContainerAccessorUtil.GetContainer()获取容器实例
如:
GetContainer
public
ISqlMapper sqlMap
=
(ContainerAccessorUtil.GetContainer())[
"
SqlServerSqlMap
"
]
as
ISqlMapper;
public
static
IContractBiz iContractBiz
=
ContainerAccessorUtil.GetContainer()[
"
CCLOG.ContractBiz
"
]
as
IContractBiz;
IBasicInfoBiz iBasicInfoBiz
=
ContainerAccessorUtil.GetContainer()[
"
CCLOG.BasicInfoBiz
"
]
as
IBasicInfoBiz;
//
...
要将IBatisNet交给Castle来管理,所以ISqlMapper的实例也必须从Castle容器中获取,这样Castle才能真正的管理IBatisNet。
从容器中获得ISqlMapper实例的方法:BaseSqlMapDao.cs
public
ISqlMapper sqlMap
=
(ContainerAccessorUtil.GetContainer())[
"
SqlServerSqlMap
"
]
as
ISqlMapper;
其中"sqlServerSqlMap"即是在我们配置IBatisNet Facility时指定的。
<
facility
id
="ibatis"
type
="Castle.Facilities.IBatisNetIntegration.IBatisNetFacility, Castle.Facilities.IBatisNetIntegration"
>
<
sqlMap
id
="SqlServerSqlMap"
config
="SqlMap.config"
/>
</
facility
>
附:
关于Global.asax文件:
Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法。你可以使用这个文件实现应用程序安全性以及其它一些任务。
Global.asax 位于应用程序根目录下。ASP.NET 页面框架能够自动识别出对Global.asax 文件所做的任何更改。
Global.asax 包含很多事件,常被用于安全性方面,可以用来处理应用程序级任务,比如用户身份验证、应用程序启动以及处理用户会话等。