Spring.NET IoC容器的用法。
通過簡單的例子學習Spring.Net
1、先創建一個控制台程序項目。
2、添加IUserInfoDal 接口。
namespace Spring.Net { public interface IUserInfoDal { void Show(); } }
3、添加AdoNetUserInfoDal類和EFUserInfoDal類,繼承IUserInfoDal接口。
AdoNetUserInfoDal.cs
public class AdoNetUserInfoDal:IUserInfoDal { public void Show() { Console.WriteLine("我是 AdoNet Dal ); } }
EFUserInfoDal.cs
public class EFUserInfoDal: 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"> <!--這里放容器里面的所有節點--> <description>An example that demonstrates simple IoC features.</description> <!--name 必須要唯一的,type=類的全名稱,所在的程序集--> <object name="UserInfoDal" type="Spring.Net.EFUserInfoDal, Spring.Net"> </object> </spring> </configuration>
6、開始寫主函數,創建spring容器上下文
namespace Spring.Net { class Program { static void Main(string[] args) { //控制權沒有反轉 //IUserInfoDal infoDal = new EFUserInfoDal(); //Spring.Net 創建實例的方式轉為容器幫我們創建 //創建spring容器上下文 IApplicationContext ctx = ContextRegistry.GetContext(); //通過容器創建對象 IUserInfoDal efDal = ctx.GetObject("UserInfoDal") as IUserInfoDal; efDal.Show(); Console.ReadKey(); } } }
7、屬性注入
<!--Spring.Net節點配置--> <spring> <context> <!--容器配置--> <resource uri="config://spring/objects"/> </context> <objects xmlns="http://www.springframework.net"> <!--這里放容器里面的所有節點--> <description>An example that demonstrates simple IoC features.</description> <!--name 必須要唯一的,type=類的全名稱,所在的程序集--> <object name="UserInfoDal" type="Spring.Net.EFUserInfoDal, Spring.Net"> <property name="Name" value="張三"/> <!--ref指向下面的屬性注入--> <property name="UserInfo" ref="UserInfo"/> </object> <!--屬性注入--> <object name="UserInfo" type="Spring.Net.UserInfo, Spring.Net"> <property name="Name" value="李四"/> <property name="Age" value="15"/> </object> </objects> </spring>
8、構造函數注入
<!--構造函數注入--> <object name="UserInfoDal2" type="Spring.Net.AdoNetUserInfoDal, Spring.Net"> <constructor-arg index="0" value="張三"/> <constructor-arg index="1" ref="UserInfo"/> </object>
9、容器配置
<context> <!--容器配置--> <resource uri="config://spring/objects"/> <!--xml文件方式,更改屬性,復制到輸出目錄:始終復制--> <!--<resource uri="file://objects.xml"/>--> <!--嵌入程序集方式,assembly://程序集名/項目名/objects.xml,更改屬性,始終復制,生成操作,嵌入的資源--> <!--<resource uri="assembly://Spring.Net/Spring.Net/objects.xml"/>--> </context>
10、完整例子
IUserInfoDal.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Spring.Net { public interface IUserInfoDal { UserInfo UserInfo { get; set; } string Name { get; set; } void Show(); } }
AdoNetUserInfoDal.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Spring.Net { public class AdoNetUserInfoDal:IUserInfoDal { public AdoNetUserInfoDal(string name, UserInfo userInfo) { Name = name; UserInfo = userInfo; } public UserInfo UserInfo { get; set; } public string Name { get; set; } public void Show() { Console.WriteLine("我是 AdoNet Dal ,屬性注入:Name=" + Name); Console.WriteLine("UserInfo ,Name=" + UserInfo.Name + " Age=" + UserInfo.Age); } } }
EFUserInfoDal.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Spring.Net { public class EFUserInfoDal: IUserInfoDal { public EFUserInfoDal() { } public UserInfo UserInfo { get; set; } public string Name { get; set; } public void Show() { Console.WriteLine("我是EF Dal,屬性注入:Name=" + Name); Console.WriteLine("UserInfo ,Name=" + UserInfo.Name + " Age=" + UserInfo.Age); } } }
App.config
<?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"/> <!--xml文件方式,更改屬性,復制到輸出目錄:始終復制--> <!--<resource uri="file://objects.xml"/>--> <!--嵌入程序集方式,assembly://程序集名/項目名/objects.xml,更改屬性,始終復制,生成操作,嵌入的資源--> <!--<resource uri="assembly://Spring.Net/Spring.Net/objects.xml"/>--> </context> <objects xmlns="http://www.springframework.net"> <!--這里放容器里面的所有節點--> <description>An example that demonstrates simple IoC features.</description> <!--name 必須要唯一的,type=類的全名稱,所在的程序集--> <object name="UserInfoDal" type="Spring.Net.EFUserInfoDal, Spring.Net"> <property name="Name" value="張三"/> <!--ref指向下面的屬性注入--> <property name="UserInfo" ref="UserInfo"/> </object> <!--構造函數注入--> <object name="UserInfoDal2" type="Spring.Net.AdoNetUserInfoDal, Spring.Net"> <constructor-arg index="0" value="張三"/> <constructor-arg index="1" ref="UserInfo"/> </object> <!--屬性注入--> <object name="UserInfo" type="Spring.Net.UserInfo, Spring.Net"> <property name="Name" value="李四"/> <property name="Age" value="15"/> </object> </objects> </spring> </configuration>
Program.cs
using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //Spring.Aop.dll 面向切面編程 //Spring.Core.dll spring框架基礎 //Common.Logging.dll 這個必須也要引用 namespace Spring.Net { class Program { static void Main(string[] args) { //控制權沒有反轉 //IUserInfoDal infoDal = new EFUserInfoDal(); //Spring.Net 創建實例的方式轉為容器幫我們創建 //第一步,引用Spring.Net程序集 Spring.Core.dll 和 Common.Logging.dll //第二步,添加Spring.Net配置節點 //第三步,配置object節點 //第四步,創建spring容器上下文 IApplicationContext ctx = ContextRegistry.GetContext(); //第五步,通過容器創建對象 IUserInfoDal efDal = ctx.GetObject("UserInfoDal") as IUserInfoDal; efDal.Show(); IUserInfoDal adoDal = ctx.GetObject("UserInfoDal2") as IUserInfoDal; adoDal.Show(); Console.ReadKey(); } } }
下面是MVC項目中使用Spring.Net融合的例子
1、將Spring.net程序集復制到項目下的packages文件夾中。
2、項目中添加引用Spring.Core.dll、Common.Logging.dll、Spring.Web.Mvc4.dll、Spring.Web.dll
3、修改Web.config,配置節點
<configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <!-- Spring.Net配置節點 --> <sectionGroup name="spring"> <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc4"/> </sectionGroup> </configSections> <!-- Spring.Net節點詳細配置 --> <spring> <context> <resource uri="file://~/Config/controllers.xml"/> </context> </spring> </configuration>
4、項目中創建Config文件夾,controllers.xml文件。
<?xml version="1.0" encoding="utf-8" ?> <objects xmlns="http://www.springframework.net"> <object type="HX.Shop.UI.Main.Controllers.AdminController, HX.Shop.UI.Main" singleton="false" > <property name="AdminService" ref="AdminService" /> </object> <object name="AdminService" type="HX.Shop.BLL.AdminService, HX.Shop.BLL" singleton="false" > </object> </objects>
5、Global.asax 中修改 SpringMvcApplication
public class MvcApplication : Spring.Web.Mvc.SpringMvcApplication //System.Web.HttpApplication