Spring.Net其实就是抽象工厂,只不过更加灵活强大,性能上并没有明显的区别。
它帮我们实现了控制反转。
其有两种依赖注入方式。
第一:属性注入
第二:构造函数注入
首先,我们去 Spring.net下载 您要的版本。
现在,我们创建一个控制台应用程序,并命名为 Spring.Net_Demo
其次,我们在引入Spring.NET=>bin=>net=>4.0=>release文件夹下的Common.Logging.dll和Spring.Core.dll两个程序集。
我们先来说最普通的通过其实现工厂中的实例。
1:并在当前程序下,创建一个命名 IUserDAL 接口 ,并约束一个命名为 Show 的方法
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Spring.Net_Demo 8 { 9 public interface IUserDAL 10 { 11 12 void Show(); 13 } 14 }
2:其次,我们在创建一命名 UserDAL 类,并实现接口 IUserDAL 中的Show 的方法
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Spring.Net_Demo 8 { 9 public class UserDAL : IUserDAL 10 { 11 12 public void Show() 13 { 14 Console.WriteLine("我是UserDAL"); 15 } 16 } 17 }
3:接下来,重点就是配置,现在我们配置好App.config
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <!--Spring.Net中注释,不然报错--> 4 5 <!-- <startup> 6 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> 7 </startup> --> 8 9 <!--Spring.Net块配置--> 10 <configSections> 11 <sectionGroup name="spring"> 12 <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/> 13 <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> 14 </sectionGroup> 15 </configSections> 16 17 <spring> 18 19 <context> 20 <resource uri="config://spring/objects"/> 21 </context> 22 23 <objects > 24 25 <!--这里的name属性,一般是对应类名,等下获取得时候对应,type中 Spring.Net_Demo.UserDAL 是 UserDAL 的类全名称,Spring.Net_Demo其程序集--> 26 <object name="UserDAL" type="Spring.Net_Demo.UserDAL,Spring.Net_Demo"> 27 28 </object> 29 30 31 </objects> 32 </spring> 33 34 </configuration>
4:然后我们在Program.cs中调用一下
//这里是初始化 IApplicationContext context = ContextRegistry.GetContext(); 创建UserDAL实例 IUserDAL userDAL = context.GetObject("UserDAL") as IUserDAL; //调用其方法 userDAL.Show(); Console.WriteLine("我是Spring.Net注入方法!");
4:现在我们可以看到结果
-----------------------------------------------------------属性依赖注入(简单值)--------------------------------------------------------------------
现在,我们来看看通过其属性依赖输入。
首先,我们修改下UserDAL类,添加一个属性,并在Show方法中输出。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Spring.Net_Demo 8 { 9 public class UserDAL : IUserDAL 10 { 11 public string Name { get; set; } 12 public void Show() 13 { 14 Console.WriteLine("我是UserDAL"+Name); 15 } 16 } 17 }
其次,我们修改下App.config配置文件在object节点下,添加一个 <property name="Name" value="我是属性Name哦"></property>
具体过程请仔细看代码。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <!--Spring.Net中注释,不然报错--> <!-- <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> </startup> --> <!--Spring.Net块配置--> <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> <spring> <context> <resource uri="config://spring/objects"/> </context> <objects > <!--这里的name属性,一般是对应类名,等下获取得时候对应,type中 Spring.Net_Demo.UserDAL 是 UserDAL 的类全名称,Spring.Net_Demo其程序集--> <object name="UserDAL" type="Spring.Net_Demo.UserDAL,Spring.Net_Demo"> <!--这里通过给Name或ID属性,名字必须一致,我们简单给个值为“我是属性Name哦”--> <property name="Name" value="我是属性Name哦"></property> </object> </objects> </spring> </configuration>
最后,在Program.cs调用不变,直接运行,结果如下:
我们可以看到,其在App.config中就是给属性赋值操作了。
-----------------------------------------------------------属性依赖注入(复杂值)--------------------------------------------------------------------
其属性注入,还可以注入更复杂的值。
例如,我们在添加一个命名为:UserServer 的类。并添加一个UserDAL的属性,并添加方法Show中输出UserDAL中Name
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Spring.Net_Demo 8 { 9 public class UserServer 10 { 11 public UserDAL userDAL { set; get; } 12 public void Show() 13 { 14 Console.WriteLine("我是UserServer"+userDAL.Name); 15 } 16 } 17 }
现在,我们该改造下App.config。详情请看代码。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <!--Spring.Net中注释,不然报错--> <!-- <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> </startup> --> <!--Spring.Net块配置--> <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> <spring> <context> <resource uri="config://spring/objects"/> </context> <objects > <!--这里的name属性,一般是对应类名,等下获取得时候对应,type中 Spring.Net_Demo.UserDAL 是 UserDAL 的类全名称,Spring.Net_Demo其程序集--> <object name="UserDAL" type="Spring.Net_Demo.UserDAL,Spring.Net_Demo"> <!--这里通过给Name或ID属性,名字必须一致,我们简单给个值为“我是属性Name哦”--> <property name="Name" value="我是属性Name哦"></property> </object> <!--这里我们在添加一个节点,属性注入复杂属性 --> <object name="UserServer" type="Spring.Net_Demo.UserServer,Spring.Net_Demo"> <!--这里属性直接指向UserDAL节点,Name属性必须对应 --> <property name="UserDAL" ref="UserDAL"></property> </object> </objects> </spring> </configuration>
现在,我们还需修改下Program.cs代码,因为我们现在是注入UserServer
1 IApplicationContext context = ContextRegistry.GetContext(); 2 //IUserDAL userDAL = context.GetObject("UserDAL") as IUserDAL; 3 //现在是注入UserServer 4 UserServer userDAL = context.GetObject("UserServer") as UserServer; 5 userDAL.Show(); 6 Console.WriteLine("我是Spring.Net注入方法!");
我们可以看到,结果跟上面简单属性注入是一样。
-----------------------------------------------------------构造函数依赖注入--------------------------------------------------------------------
构造函数注入,其实也差不多。首先,我们修改下UserDAL代码。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Spring.Net_Demo 8 { 9 public class UserDAL : IUserDAL 10 { 11 public string Name { get; set; } 12 13 //这里添加一个构造函数 14 public UserDAL(string name) 15 { 16 Name = name; 17 } 18 19 public void Show() 20 { 21 Console.WriteLine("我是UserDAL"+Name); 22 } 23 } 24 }
接下来,我们依然是要修改下App.config配置文件。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <!--Spring.Net中注释,不然报错--> <!-- <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> </startup> --> <!--Spring.Net块配置--> <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> <spring> <context> <resource uri="config://spring/objects"/> </context> <objects > <!--我们注释掉这一部分--> <!--这里的name属性,一般是对应类名,等下获取得时候对应,type中 Spring.Net_Demo.UserDAL 是 UserDAL 的类全名称,Spring.Net_Demo其程序集 <object name="UserDAL" type="Spring.Net_Demo.UserDAL,Spring.Net_Demo"> 这里通过给Name或ID属性,名字必须一致,我们简单给个值为“我是属性Name哦 <property name="Name" value="我是属性Name哦"></property> </object> --> <!--这里为构造函数注入,两个选择一个就可,不在细说,有注释--> <object> <!--构造函数注入 Name不区分大小,对应构造参数名 --> <constructor-arg name="name" value="构造函数注入"></constructor-arg> <!-- 构造函数注入,需声明构造, 可直接用index=0 --> <!-- <constructor-arg index="0" value="构造函数注入"></constructor-arg> --> </object> <!--这里我们在添加一个节点,属性注入复杂属性 --> <object name="UserServer" type="Spring.Net_Demo.UserServer,Spring.Net_Demo"> <!--这里属性直接指向UserDAL节点,Name属性必须对应 --> <property name="UserDAL" ref="UserDAL"></property> </object> </objects> </spring> </configuration>
接下,调用代码无需改变,我们看下结果。
-----------------------------------------------------------外部引入XML文件--------------------------------------------------------------------
如果越来越多类,我们要注入,在配置文件里不会越来越多注入声明吗?
我们可以独立把这些独立放在一个XML文件里,然后在配置文件里声明块就可以了。
首先,我们新建一个Server.xml,在里面放入<objects>节点的所有代码。
当然,您可以新建多个,比如在三层中,一个是DAL层,一个是BLL层等等,这里就不怎么一一展示了。
(这里需注意下,因为我的是控制台应用程序,需右键这个XML文件,修改其属性《生成操作=> 嵌入的资源》)。
1 <?xml version="1.0" encoding="utf-8" ?> 2 <objects> 3 4 <object name="UserDAL" type="Spring.Net_Demo.UserDAL,Spring.Net_Demo"> 5 6 7 <!--构造函数注入 可直接用index=0--> 8 <constructor-arg index="0" value="外部引入哦"></constructor-arg> 9 </object> 10 11 </objects>
然后修改下App.comfig ,详情请看代码
<?xml version="1.0" encoding="utf-8" ?> <configuration> <!--Spring.Net中注释,不然报错--> <!-- <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> </startup> --> <!--Spring.Net块配置--> <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> <spring> <context> <resource uri="config://spring/objects"/> <!-- 外部XML文件引入,在控制台中,同时需把文件属性中的生成操作改成‘嵌入资源‘--> <resource uri="assembly://Spring.Net_Demo/Spring.Net_Demo/Server.xml"/> </context> </spring> </configuration>
调用的话,不需要任何改变。
本文结束。
以上两种注入方法,虽然有点啰嗦,勿介意哈,老鸟飘过哈。