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


 

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

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

 

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

如:

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

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

遇到此種情況,如果不借助控制反轉,使用普通的方式解決的話,則每個用戶都需要修改后台代碼(違反了OOP中的開閉原則),才能實現不同用戶調用不同數據訪問層的問題

 

1、先創建一個控制台程序項目。

2、添加IUserInfoDal 接口。

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

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

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");
        }     
    }
復制代碼

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

5、添加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>
復制代碼

6、主函數,創建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

類似於抽象工場(使用反射機制,在配置文件中配置)
 
        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM