C#設計模式之控制反轉即依賴注入-Spring.NET

 

主流的依賴注入方案:微軟企業庫中的Unity、Spring.NET、StructureMap、Ninject、Castle Windsor等等。spring

本章用簡單的案例講解 Spring.NET IOC-控制反轉即依賴注入:app

 

實例:使用Spring.NET IOC方式,解決複雜的數據訪問,函數

如:spa

用戶A須要使用ADO.NET實現數據訪問層代碼;.net

用戶B須要使用EF實現數據訪問層代碼;code

遇到此種狀況,若是不借助控制反轉,使用普通的方式解決的話,則每一個用戶都須要修改後臺代碼(違反了OOP中的開閉原則),才能實現不一樣用戶調用不一樣數據訪問層的問題cdn

 

一、先建立一個控制檯程序項目。xml

二、添加IUserInfoDal 接口。對象

複製代碼
namespace Spring.Net
{
    public interface IUserInfoDal
    {
        void Show();
    }
}
複製代碼

三、添加Ado_NetUserInfoDal類和EFUserInfoDal類,繼承IUserInfoDal接口。blog

ADO_NetUserInfoDal.cs
複製代碼
public class ADO_NetUserInfoDal:IUserInfoDal
    {
        public void Show()
        {
            Console.WriteLine("我是 AdoNet Dal" );
        }
    }
複製代碼

EF_UserInfoDal.cs

複製代碼
public class EF_UserInfoDal: IUserInfoDal
    {
        public void Show()
        {
            Console.WriteLine("我是EF Dal");
        }     
    }
複製代碼

四、引用Spring.Net程序集 Spring.Core.dll 和 Common.Logging.dll

五、添加Spring.Net配置節點,配置object節點

複製代碼
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <!--必定要在緊跟着configuration下面添加-->
  <configSections>
    <!--跟下面Spring.Net節點配置是一一對應關係-->
    <sectionGroup name="spring">
      <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
      <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
    </sectionGroup>
  </configSections>
  
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>

  <!--Spring.Net節點配置-->
  <spring>
    <context>
      <!--容器配置-->
      <resource uri="config://spring/objects"/>
    </context>
    <objects xmlns="http://www.springframework.net">
      <!--name 必需要惟一的,type=類的全名稱,所在的程序集-->
     <object name="UserInfoDal" type="Spring.Net.EF_UserInfoDal, Spring.Net">
      </object>      
  </spring>
</configuration>
複製代碼

六、主函數,建立spring容器上下文

複製代碼
namespace Spring.Net
{
    class Program
    {
        static void Main(string[] args)
        {
            //控制權沒有反轉
            //IUserInfoDal infoDal = new EFUserInfoDal();
         //IUserInfoDal infoDal = new ADO_NetUserInfoDal();

//Spring.Net 建立實例的方式轉爲容器幫咱們建立
       //建立spring容器上下文 
       IApplicationContext ctx = ContextRegistry.GetContext();
      //經過容器建立對象
      IUserInfoDal efDal = ctx.GetObject("UserInfoDal") as IUserInfoDal;

      efDal.Show();
      Console.ReadKey();
     }
    }
   }

輸出:
    我是EF Dal

注:
若是在app.config 配置文件中
<object name="UserInfoDal" type="Spring.Net.EF_UserInfoDal, Spring.Net">
將 EF_UserInfoDal 改成 ADO_NetUserInfoDal 則
輸出:
    我是 AdoNet Dal相似於抽象工場(使用反射機制,在配置文件中配置)
相關文章
相關標籤/搜索