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