主流的依賴注入方案:微軟企業庫中的Unity、Spring.NET、StructureMap、Ninject、Castle Windsor等等。spring
本章用簡單的案例講解 Spring.NET IOC-控制反轉即依賴注入:app
實例:使用Spring.NET IOC方式,解決複雜的數據訪問,函數
如:spa
用戶A須要使用ADO.NET實現數據訪問層代碼;.net
用戶B須要使用EF實現數據訪問層代碼;code
遇到此種狀況,若是不借助控制反轉,使用普通的方式解決的話,則每一個用戶都須要修改後臺代碼(違反了OOP中的開閉原則),才能實現不一樣用戶調用不一樣數據訪問層的問題cdn
一、先建立一個控制檯程序項目。xml
二、添加IUserInfoDal 接口。對象
namespace Spring.Net { public interface IUserInfoDal { void Show(); } }
三、添加Ado_NetUserInfoDal類和EFUserInfoDal類,繼承IUserInfoDal接口。blog
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");
}
}
四、引用Spring.Net程序集 Spring.Core.dll 和 Common.Logging.dll
五、添加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>
六、主函數,建立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相似於抽象工場(使用反射機制,在配置文件中配置)