1. 程式人生 > >運用Unity實現依賴註入[結合簡單三層實例]

運用Unity實現依賴註入[結合簡單三層實例]

修改配置文件 unity 理論 構造 div support gis ctc 開發

一:理論部分

依賴註入:這是 Ioc 模式的一種特殊情況,是一種基於改變對象的行為而不改變類的內部的接口編程技術。開發人員編寫實現接口的類代碼,並基於接口或者對象類型使用容器註入依賴 的對象實例到類中。用於註入對象實例的技術是接口註入、構造函數註入、屬性(設置器)註入和方法調用註入。

Unity是微軟企業庫一部分,是一個輕量級、可擴展的依賴註入容器,支持構造函數、屬性和方法調用註入;

針對依賴註入以前我也寫過一篇結合三層的文章:spring.net 結合簡單三層實例

二:實例簡介

1:本實例將通過一個簡單的三層演示使用Unity實現依賴註入,並把相應的具體實例寫入在配置文件裏,達到後期可能方便修改;首先看一下實例分層的情況:

技術分享

IAopDAL-數據接口層(類庫) [AopDAL AopOracelDAL]-分別實現數據接口的數據層(類庫)

IAopBLL-邏輯接口層(類庫) AopBLL-實現邏輯接口層(類庫)

AopUnity-主程序層(控制臺程序)

Command-公共助手層(類庫)

2:其中Command我們簡單編寫一個實現Unity助手的類;首先要引用幾個Unity的DLL文件;

技術分享

3:AopDAL、AopOracelDAL是兩個實現不同功能的類庫,在這我們就比喻成一個插入MSSQL數據庫,另外一個就是插入Oracel數據庫;

其中AopBLL我們沒有直接引用具體的AopDAL數據層,而是引用其對應接口層;主程序 AopUnity同樣也沒有具體的BLL層,也是引用其BLL接口層;

把接口對應的具體層類寫入到配置文件裏,做到依賴註入,只要簡單修改配置文件就可以達到修改調用;

因為AopDAL、AopOracelDAL、AopBLL我們都沒有直接引用,所以在生成DLL後是不會保存在主程序的bin裏面,所以我們要修改這三個生成的路徑;

技術分享 技術分享 技術分享

三:實例編碼

1:IAopDAL層我們只簡單創建一個IReadData類代碼:

技術分享
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IAopDAL
{
    public interface IReadData
    {
        string ReadDataStr(string Name);
    }
}
技術分享

2:AopDAL實現接口層IAopDAL

技術分享
using IAopDAL;
namespace AopDAL
{
    public class ReadDataDAL:IReadData
    {
        public string ReadDataStr(string Name)
        {
            return string.Format("把{0}寫入MSSQL數據庫成功", Name);
        }
    }
}
技術分享

3:AopOracelDAL同樣實現IAopDAL層,其功能跟AopDAL一樣

技術分享
using IAopDAL;
namespace AopOracelDAL
{
    public class ReadDataDAL:IReadData
    {
        public string ReadDataStr(string Name)
        {
            return string.Format("把{0}寫入Oracel數據庫成功", Name);
        }
    }
}
技術分享

4:IAopBLL邏輯接口層的內容如下:

技術分享
namespace IAopBLL
{ 
    public interface IReadDataBLL
    {
        string ReadDataStr(string Name);
    }
}
技術分享

5:AopBLL層實現IAopBLL接口層,要引用IAopDAL、IAopBLL、Command;

其中IReadData bllServer = new UnityContainerHelp().GetServer<IReadData>();就是過過公共助手Command類庫調用Unity來實現依賴註入,

技術分享
using IAopDAL;
using IAopBLL;
using Command;
namespace AopBLL
{
    public class ReadDataBLL:IReadDataBLL
    {
        IReadData bllServer = new UnityContainerHelp().GetServer<IReadData>();
        public string ReadDataStr(string Name)
        {
            return bllServer.ReadDataStr(Name);
        }
    }
}
技術分享

6:Command公類助手代碼如下,簡單對Unity的封裝,引用幾個Unity的命名空間,我們把依賴註入的對象寫入在主程序的.config文件裏,這邊就是通過讀取配置文件來查看其對應哪個類庫;

技術分享
using System.Text;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using Microsoft.Practices.Unity.InterceptionExtension;
using Microsoft.Practices.Unity.InterceptionExtension.Configuration;
using System.Configuration;

namespace Command
{
    public class UnityContainerHelp
    {
        private IUnityContainer container;
        public UnityContainerHelp()
        {
            container = new UnityContainer();
            UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
            container.LoadConfiguration(section, "FirstClass");
        }

        public T GetServer<T>()
        {
            return container.Resolve<T>();
        }

        public T GetServer<T>(string Name)
        {
            return container.Resolve<T>(Name);
        }
    }
}
技術分享

7:主程序代碼:同樣只是簡單的引用Command、IAopBLL兩層;

技術分享
using Command;
using IAopBLL;
namespace AopUnity
{
    class Program
    {
        static void Main(string[] args)
        {
            IReadDataBLL bllServer = new UnityContainerHelp().GetServer<IReadDataBLL>();
            Console.WriteLine(bllServer.ReadDataStr("踏浪帥"));
        }
    }
}
技術分享

我們新建一個App.config文件(因為我主程序是控制臺,若是WEB程序可以把它放在web.config裏面);其中register 就是我們註入的節點,type為接口層,mapTo則是我們對應的具體實現層,這邊也是我們修改配置的地方;

技術分享
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
  </configSections>
  <unity xmlns="http://schemas.microsoft.com/practces/2010/unity">
    <container name="FirstClass">
      <register type="IAopBLL.IReadDataBLL,IAopBLL" mapTo="AopBLL.ReadDataBLL,AopBLL">
      </register>
      <register type="IAopDAL.IReadData,IAopDAL" mapTo="AopOracelDAL.ReadDataDAL,AopOracelDAL"/>
    </container>
  </unity>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
技術分享


四:運行效果

1:當配置文件裏為:

<register type="IAopDAL.IReadData,IAopDAL" mapTo="AopOracelDAL.ReadDataDAL,AopOracelDAL"/>

技術分享

2:修改配置文件內容:

技術分享

技術分享

我們只是簡單的修改配置就達到我們想要的效果,消除對具體實現層的引用;

如果,您認為閱讀這篇博客讓您有些收獲,不妨點擊一下右下角的【推薦】按鈕。 因為,我的寫作熱情也離不開您的肯定支持。

感謝您的閱讀(因為源代碼現在我正接著寫Unity實現AOP的功能,所以將在實現功能後一起貼出)

運用Unity實現依賴註入[結合簡單三層實例]