這個好像、也許、或許、大概、應該、Maybe真的可以算是傳說中的Spring.Net了吧
以前寫過一篇名叫”這個好像、也許、大概、應該、Maybe真的算是傳說中的面向接口編程了吧“的文章,當時好像是在評論里許諾以后會有一篇叫”文章這個好像、也許、大概、應該、Maybe真的算是傳說中的Spring.Net吧“。然后,現在在我們節日的時候,大抵可以算是來承兌諾言的吧。
先介紹一下IoC吧。它呢,中文名字是控制反轉。英文是Inversion of Control。Spring.Net就是IoC的一個框架。原本的對象是由類來管理的,比如讓創建一個此類的實例,我們會new此類。有了IoC我們就不需要用到這個類去new了,或者說是不用這個類去管理它相應的對象了。而是交給了我們的IoC框架來管理這些了。這樣不用類去管理的話,就可以做到松耦合。劉冬先生寫過Spring.Net的一個系列,感興趣的朋友可以看一下的。
我在這里就寫一個小小的案例吧。
最開始,先創建一個窗體的應用程序,在窗體上創建一個按鈕並且將窗體應用程序的輸出類型改成控制台應用程序(如若不改成控制台應用程序,那么將無法輸出我們想要的結果)。建立一個類和一個接口。寫類和接口,是為后面調用實例做准備。

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace SpringNetStudy1024 8 { 9 class Mutudu:IMutudu 10 { 11 public void Show() 12 { 13 Console.WriteLine( "小杜成功的寫了一個Spring.Net的案例" ); 14 } 15 } 16 }

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace SpringNetStudy1024 8 { 9 interface IMutudu 10 { 11 void Show(); 12 } 13 }
因為我們是需要用到第三方的類庫的。那么我們得先把Spring.Net第三方的類庫先添加到我們的項目當中來。我們就在項目中新建立一個文件夾,將我們需要的第三方類庫拷貝進來。然后項目添加對這些第三方類庫的引用。我們必須要引用的有兩個dll,一個是Common.Logging.dll。另外一個是Spring.Core.dll.這兩個是必不可少的。

如若少了,則會這樣(我曾經少引用了一個):

第三方類庫我們是引用進來了。我們說了,類是交給我們的IoC容器來管理的,那么我們的IoC容器呢?我們需要得到IoC容器,然后IoC容器才好去管理吧。關於這個嘛,我們是通過配置初始化IoC容器。也就是初始化IApplicationContext。個人認為這個類的地位是有點類似於EF里的上下文的,有點承上啟下的意思。那么修改一下App.Config吧。

1 <?xml version="1.0" encoding =" utf-8" ?> 2 <configuration> 3 < configSections> 4 < sectionGroup name =" spring" > 5 < section name =" context" type="Spring.Context.Support.ContextHandler, Spring.Core" /> 6 < section name =" objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> 7 </ sectionGroup> 8 </ configSections> 9 < spring> 10 < context> 11 < resource uri =" config://spring/objects"/> 12 </ context> 13 < objects xmlns =" http://www.springframework.net"> 14 < description>An example that demonstrates simple IoC features.</description> 15 </ objects> 16 </ spring> 17 </configuration>
另外需要說一下的就是在配置文件中,我們是通過objects節點的子節點來配置程序中用到的對象的,當然,object節點其是位於objects(有s)節點下的。比如我們現在需要把我們那會寫的類配置進來,那么就在objects節點下配置object節點:

1 <? xml version =" 1.0" encoding =" utf-8" ?> 2 < configuration> 3 < configSections > 4 < sectionGroup name =" spring" > 5 < section name =" context" type =" Spring.Context.Support.ContextHandler, Spring.Core" /> 6 < section name =" objects" type =" Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> 7 </ sectionGroup > 8 </ configSections > 9 < spring > 10 < context > 11 < resource uri =" config://spring/objects "/> 12 </ context > 13 < objects xmlns =" http://www.springframework.net "> 14 < description >An example that demonstrates simple IoC features.</ description> 15 <!-- 下面就是將類交給窗口管理的配置代碼,僅此一行。 --> 16 < object name =" Mutudu" type =" SpringNetStudy1024.Mutudu, SpringNetStudy1024" > </ object> 17 </ objects > 18 </ spring > 19 </ configuration> 20
通過"IApplicationContext ctx = ContextRegistry .GetContext();"這行代碼拿到的就是配置好的object下節點我們配置好的對象。這行代碼蠻關鍵的。
那么,我們看一下按鈕點擊事件里的代碼:

1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 using Spring.Context; 11 using Spring.Context.Support; 12 13 namespace SpringNetStudy1024 14 { 15 public partial class Form1 : Form 16 { 17 public Form1() 18 { 19 InitializeComponent(); 20 } 21 22 private void PowerOfIoC_Click( object sender, EventArgs e) 23 { 24 //這里返回的或者說得到的就是根據我們在object節點的內容配置好的容器的對象。 25 IApplicationContext ctx = ContextRegistry .GetContext(); 26 //然后就可以通過得到的對象,得到實例了。 27 IMutudu mutudu = ( IMutudu)ctx.GetObject( "Mutudu"); 28 //調用一下方法。 29 mutudu.Show(); 30 } 31 } 32 }
好的。代碼寫好了,執行一下吧,點擊按鈕,看一下Spring.Net的力量吧(真的沒有new哦):

如此看來的話,小杜倒是成功的寫了一個關於Spring.Net的一個小Demo。引用配置一下,也就差不多了吧。另外還有一些屬性注入構造函數注入的。只能說興許我會寫個續,恩,興許。
如有不對之處,請斧正。另,諸君,節日快樂。