上一篇写了IoC的心得,主要从一个架构的角度出发看待IoC和传统方式的区别。这次写一下IoC在.net中的实现。
现在实现IoC的已经有不少框架了,比如我用过的Castle.net,不少是从JAVA那边翻译到.net过来的。我用过Castle.net中实现的IoC容器, 不知是不是我研究不够透,发现Castle的IoC容器要求实现业务功能的dll只能放在bin目录中,如果知道如何不用把dll放在目录中的网友请告之。如果只能把实现业务的dll放在bin目录中,则这种IoC容器就稍微有点逊色了。
试想,如果一个有N个功能的项目在跑,某个时刻,某1个功能出了点小毛病或者需要更新其实现,但是更新的时候不想去影响N-1个功能的状态,也就是只把更新影响的范围缩小在这1个功能中,传统的方式是无论如何都做不到的。一更新,则整个项目就会重启。IoC除了有传统方式的特征外,还能做到只把更新影响缩小到一个功能之内,对其他N-1个功能没有任何的影响。做法就是把N个功能按照需要设计成N个dll,并且把这些dll放到一个普通的目录中。通过IoC容器反射出这些dll加载到项目中。通过在配置文件设置各种参数,比如配置文件更新的时间间隔,dll缓存的时间间隔等等。如果dll的缓存时间是永久,那么就和传统的前引用方式没太大区别了。
先来看看实现代码的效果而后再写出实现的主要代码:
给出config.xml
<configuration timeout="60"><!--此处的timeout单位是秒。如果更改timeout要生效,则需要重启IIS服务-->
<components directory="/App_Data/Business/"> <!--存放的dll所在的根目录-->
<block id="SqlServer" dllpath="SqlServerBusiness.dll">
<component name="IBusiness.INews" server="SqlServerBusiness.News"/>
<component name="IBusiness.IUser" server="SqlServerBusiness.User"/>
</block>
<block id="GlobalBusiness" dllpath="GlobalBusiness.dll" default="true"><!--设置默认的block-->
<component name="IBusiness.sys.ISys" server="GlobalBusiness.Sys.Sys"/>
<component name="IBusiness.sys.IRole" server="GlobalBusiness.Sys.Role"/>
<component name="IBusiness.IUser" server="GlobalBusiness.User"/>
<component name="IBusiness.IBiz" server="GlobalBusiness.Biz"/>
</block>
<block id="Sqlite" dllpath="SqliteBusiness.dll">
<component name="IBusiness.INews" server="SqliteBusiness.News"/>
<component name="IBusiness.IUser" server="SqliteBusiness.User"/>
</block>
</components>
这里的例子,是以分数据库为主。所以,block的命名就能看出数据库。每个component就定义了接口与实现类的绑定关系。在configuration中,定义了timeout,表示每个timeout时间,则IoC容器会重新读一次配置。
然后,找一个地方,保证整个项目运行周期内只执行一遍的位置,asp.net则是在Global.ascx,winform之类的项目则可以在Program.cs中。
这里假设是asp.net项目,实现代码如下:
这就初始化了IoC容器所需要的必备条件。
然后,在使用的时候,则原来的new语句则变成如下代码:
IRole irole = IoCContainer.Instance.Resolve<IRole>()
至此,IoC在项目中实现的代码就这么多了。
实现IoC容器的Resolve方法是核心,主要代码如下:
有需要IoC实现的dll的,则可以联系我,给我写信:luguandao@famouz.net,没积分,上传不了资源