以前写过一篇名叫”这个好像、也许、大概、应该、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 }
Mutudu
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 }
IMutudu
因为我们是需要用到第三方的类库的。那么我们得先把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>
App.Config
另外需要说一下的就是在配置文件中,我们是通过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
类让IoC来管理吧。
通过"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。引用配置一下,也就差不多了吧。另外还有一些属性注入构造函数注入的。只能说兴许我会写个续,恩,兴许。
如有不对之处,请斧正。另,诸君,节日快乐。