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

 
    
   
     
     
   

   
     
     
     
     
   

    
     
     
   

 

 

  这里的例子,是以分数据库为主。所以,block的命名就能看出数据库。每个component就定义了接口与实现类的绑定关系。在configuration中,定义了timeout,表示每个timeout时间,则IoC容器会重新读一次配置。

 

 然后,找一个地方,保证整个项目运行周期内只执行一遍的位置,asp.net则是在Global.ascx,winform之类的项目则可以在Program.cs中。

这里假设是asp.net项目,实现代码如下:

protected void Application_Start(object sender, EventArgs e) { IoCContainer.Start(AppDomain.CurrentDomain.BaseDirectory, HttpContext.Current.Server.MapPath("/App_Data/ioc_config.xml")); }

 

这就初始化了IoC容器所需要的必备条件。

然后,在使用的时候,则原来的new语句则变成如下代码:

 IRole irole = IoCContainer.Instance.Resolve()

 

至此,IoC在项目中实现的代码就这么多了。

 

   实现IoC容器的Resolve方法是核心,主要代码如下:

private T _Resolve(ContainerBlock cd) { if (this._config == null || this._config.items.Count == 0) return default(T); string dir = this._config.items[0].directory; string name = typeof(T).FullName; string dllpath = cd.dllpath; if (cd.IsRelativeDllPath) dllpath = System.IO.Path.Combine(dir, cd.dllpath); dllpath = ApplicationRootDir + dllpath.Replace("/", @"/"); ContainerComponent cct = cd.GetComponent(name); // if (cct == null) return default(T); if (cct == null) { throw new Exception("can not find the " + name + " component"); } Assembly assem = Assembly.Load(LoadDll(dllpath)); object o = assem.CreateInstance(cct.server); if (o == null) { throw new Exception("在" + dllpath + "中没有找到" + cct.server + "类"); } return (T)o; }

 

有需要IoC实现的dll的,则可以联系我,给我写信:[email protected],没积分,上传不了资源

 

你可能感兴趣的:(IoC的实现)