IoC的实现

     上一篇写了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,没积分,上传不了资源

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值