運用Unity實現依賴註入[結合簡單三層實例]
一:理論部分
依賴註入:這是 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實現依賴註入[結合簡單三層實例]