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

一:理論部分html

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

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

針對依賴注入之前我也寫過一篇結合三層的文章:spring.net 結合簡單三層實例數據庫

 

二:實例簡介編程

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

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

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

AopUnity-主程序層(控制檯程序).net

Command-公共助手層(類庫)code

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的功能,因此將在實現功能後一塊兒貼出)

相關文章
相關標籤/搜索