主流的依賴注入方案:微軟企業庫中的Unity、Spring.NET、StructureMap、Ninject、Castle Windsor等等。
本章用簡單的案例講解 Spring.NET IOC-控制反轉即依賴注入:
實例:使用Spring.NET IOC方式,解決復雜的數據訪問,
如:
用戶A需要使用ADO.NET實現數據訪問層代碼;
用戶B需要使用EF實現數據訪問層代碼;
遇到此種情況,如果不借助控制反轉,使用普通的方式解決的話,則每個用戶都需要修改后台代碼(違反了OOP中的開閉原則),才能實現不同用戶調用不同數據訪問層的問題
1、先創建一個控制台程序項目。
2、添加IUserInfoDal 接口。
namespace Spring.Net { public interface IUserInfoDal { void Show(); } }
3、添加Ado_NetUserInfoDal類和EFUserInfoDal類,繼承IUserInfoDal接口。
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");
}
}
4、引用Spring.Net程序集 Spring.Core.dll 和 Common.Logging.dll
5、添加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>
6、主函數,創建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
類似於抽象工場(使用反射機制,在配置文件中配置)