前面準備:下載spring.net並解壓 下載地址:spring.net下載地址 Ioc:控制反轉 DI:依賴註入 一、IOC(控制反轉) 1.新建一個控制台程式springTest,引用dll。 Spring.NET > bin > net > 4.0 > release下找到 Comon.Log ...
前面準備:下載spring.net並解壓
下載地址:spring.net下載地址
Ioc:控制反轉 DI:依賴註入
一、IOC(控制反轉)
1.新建一個控制台程式springTest,引用dll。
Spring.NET > bin > net > 4.0 > release下找到 Comon.Logging.dll和Spring.Core.dll這兩個dll複製到項目中添加引用
2.添加一個介面
interface Person { void Show(); }
3.添加兩個類實現介面
public class zhangsan:Person { public void Show() { Console.WriteLine("Hello World 張三"); } }
public class LiSi:Person { public void Show() { Console.WriteLine("Hello World 李四"); } }
4.修改配置文件app.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <!-- 這個節點要緊靠在configuration下麵--> <configSections> <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="zhangsan" type="springTest.zhangsan,springTest"></object> <object name="lisi" type="springTest.lisi,springTest"></object> </objects> </spring> </configuration>
主要是 <configSections> 和<spring>兩個節點裡面的內容,<configSections>的內容是固定的,要修改的是<spring>下的內容
5.開始寫主函數
class Program { static void Main(string[] args) { //普通創建Iperson方式控制權沒有反轉,要new出來,偶合性高 //IPerson person = new zhangsan(); //創建實例的方式轉為容器幫我們創建 //創建容器上下文 IApplicationContext ctx = ContextRegistry.GetContext(); IPerson person = ctx.GetObject("zhangsan") as IPerson; person.Show(); Console.ReadKey(); } }
結果:
這就實現了Spring.Net中的Ioc操作
6.把容器單獨寫到一個xml文件
因為每個需要用到控制反轉的類都要配置到配置文件中,如果非常多類,那配置文件就很難看了。所以最好把配置放到一個單獨的xml文件中
6.1 添加一個xml文件這裡命名為:person.xml放到一個lib文件夾里
6.2 把app.config配置文件中的 objects節點複製到person.xml文件中,然後把app.config配置文件中objects裡面的節點都刪除,註意objects節點保留
<?xml version="1.0" encoding="utf-8" ?> <objects xmlns="http://www.springframework.net"> <description>An example that demonstrates simple IoC features.</description> <!-- 容器--> <!-- name要唯一,type="類的全名稱,所在程式集"--> <object name="zhangsan" type="springTest.zhangsan,springTest"></object> <object name="lisi" type="springTest.lisi,springTest"></object> </objects>
6.3在app.config中節點<spring>中加入person.xml文件的關聯<resource uri="file://person.xml"/>
<!-- spring.Net節點配置--> <spring> <context> <!-- 容器配置--> <resource uri="file://person.xml"/> <resource uri="config://spring/objects"/> </context> <objects xmlns="http://www.springframework.net"> </objects > </spring>
6.4 因為控制台程式預設的根路徑為bin下的debug文件夾,所以要把person.xml生成時複製到debug文件夾下
在person.xml文件滑鼠右鍵=>屬性=>複製到輸出目錄=>始終複製
配配置完成,再次運行,效果和原來的一樣,以後容器的配置就可以在單獨的xml文件里增加了。
二、DI(依賴註入)
1.修改zhangsan類,變成
public class zhangsan:IPerson { public string Name { get; set; } public void Show() { Console.WriteLine("Hello World "+Name); } }
2.修改person.xml文件中的節點
<object name="zhangsan" type="springTest.zhangsan,springTest"> <property name="Name" value="張三"/> </object>
3.運行結果和原來一樣,屬性的值也可以在文件中配置了:
4.還有一種情況,添加一個類
public class PersonName { public string Name { get; set; } }
5.修改zhangsan類
public class zhangsan:IPerson { PersonName pName = new PersonName(); public void Show() { Console.WriteLine("Hello World "+pName.Name); } }
6.這樣就不能用上面那種屬性註入方法了,這時要修改person.xml變成
<object name="zhangsan" type="springTest.zhangsan,springTest"> <property name="pName" ref="pname"/> </object> <object name="pname" type="springTest.PersonName,springTest"> <property name="Name" value="張三"/>
運行結果依然是和原來一樣。
這就是DI,屬性註入。