LYWILL设计运营 - 网站运营与推广、开发技术、成功项目展示。

Spring.NET依赖对象的注入总结

        一、属性注入

  上篇《Spring.NET如何解耦合(依赖注入)》,简单提到依赖注入的用途。回顾一下所讲内容,发现在object节点下使用了<property name="Tool" ref="computer"/>property 标签正是用来属性注入的。而ref是用来标识是关联到哪个object。而name属性是指属性名。如下:

XML/HTML代码
  1. <object id="modernPerson" type="SpringNetIoC.ModernPerson, SpringNetIoC">  
  2. <property name="Tool" ref="computer"/>  
  3. </object>  

 

值类型的注入是需要使用property 节点的value属性。<property name="Name" value="lywill"/>

作为内联类型可以使用如下:

XML/HTML代码
  1. <property name="Friend">  
  2. <object type="SpringNetDi.Person, SpringNetDi"/>  
  3. </property>  


同理,内联类型可以是循环引用的对象(见代码处)。

  二、构造函数注入

构造器注入使用constructor-arg标签作为标识。同样具有于属性注入相同的方式,使用namerefvalue作为构造器注入的属性,如下:

XML/HTML代码
  1. <!--构造器注入-->  
  2. <constructor-arg name="argPerson" ref="person"/>  
  3. <constructor-arg name="intProp" value="1"/>  

  程序的代码如下:

C#代码
  1. public class Person   
  2. {   
  3.     public string Name { getset; }   
  4.     public int Age { getset; }   
  5.     public Person Friend { getset; }   
  6. }  

 

C#代码
  1. public class PersonDao   
  2. {   
  3.   
  4.     private Person argPerson;   
  5.     private int intProp;   
  6.   
  7.     public PersonDao(Person argPerson, int intProp)   
  8.     {   
  9.         this.argPerson = argPerson;   
  10.         this.intProp = intProp;   
  11.     }   
  12.   
  13.     public void Get()   
  14.     {   
  15.         //构造函数注入的整型参数   
  16.         Console.WriteLine(string.Format("intProp:{0}", intProp));   
  17.   
  18.         //构造函数注入的Person   
  19.         Console.WriteLine(string.Format("argPerson Name:{0}", argPerson.Name));   
  20.         Console.WriteLine(string.Format("argPerson Age:{0}", argPerson.Age));   
  21.   
  22.         //内联对象Friend   
  23.         Console.WriteLine(string.Format("argPerson Friend Name:{0}", argPerson.Friend.Name));   
  24.         Console.WriteLine(string.Format("argPerson Friend Age:{0}", argPerson.Friend.Age));   
  25.   
  26.         //内联对象的循环引用   
  27.         Console.WriteLine(string.Format("argPerson Friend Friend Name:{0}", argPerson.Friend.Friend.Name));   
  28.         Console.WriteLine(string.Format("argPerson Friend Friend Age:{0}", argPerson.Friend.Friend.Age));   
  29.     }   
  30. }  
XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <configuration>  
  3.   
  4.   <configSections>  
  5.     <sectionGroup name="spring">  
  6.       <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" />  
  7.       <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />  
  8.     </sectionGroup>  
  9.   </configSections>  
  10.   
  11.   <spring>  
  12.   
  13.     <context>  
  14.       <resource uri="config://spring/objects" />  
  15.     </context>  
  16.   
  17.     <objects xmlns="http://www.springframework.net">  
  18.   
  19.       <object id="person" type="SpringNetDi.Person, SpringNetDi">  
  20.         <!--属性值类型注入-->  
  21.         <property name="Name" value="lywill"/>  
  22.         <property name="Age" value="30"/>  
  23.   
  24.         <!--内联对象注入-->  
  25.         <property name="Friend">  
  26.           <object type="SpringNetDi.Person, SpringNetDi">  
  27.             <property name="Name" value="lyvenus"/>  
  28.             <property name="Age" value="29"/>  
  29.             <property name="Friend" ref="person"/>  
  30.           </object>  
  31.         </property>  
  32.            
  33.       </object>  
  34.   
  35.       <object id="personDao" type="SpringNetDi.PersonDao, SpringNetDi">  
  36.         <!--构造器注入-->  
  37.         <constructor-arg name="argPerson" ref="person"/>  
  38.         <constructor-arg name="intProp" value="1"/>  
  39.            
  40.       </object>  
  41.   
  42.     </objects>  
  43.   
  44.   </spring>  
  45.   
  46. </configuration>  

 

C#代码
  1. class Program   
  2. {   
  3.     static void Main(string[] args)   
  4.     {   
  5.         IApplicationContext ctx = ContextRegistry.GetContext();   
  6.   
  7.         PersonDao dao = ctx.GetObject("personDao"as PersonDao;   
  8.         dao.Get();   
  9.   
  10.         Console.ReadLine();   
  11.     }   
  12. }  
 
 

  输出效果如下: