Spring.NET依赖对象的注入总结
一、属性注入
上篇《Spring.NET如何解耦合(依赖注入)》,简单提到依赖注入的用途。回顾一下所讲内容,发现在object节点下使用了<property name="Tool" ref="computer"/>。而property 标签正是用来属性注入的。而ref是用来标识是关联到哪个object。而name属性是指属性名。如下:
XML/HTML代码
- <object id="modernPerson" type="SpringNetIoC.ModernPerson, SpringNetIoC">
- <property name="Tool" ref="computer"/>
- </object>
值类型的注入是需要使用property 节点的value属性。如<property name="Name" value="lywill"/>
作为内联类型可以使用如下:
XML/HTML代码
- <property name="Friend">
- <object type="SpringNetDi.Person, SpringNetDi"/>
- </property>
同理,内联类型可以是循环引用的对象(见代码处)。
二、构造函数注入
构造器注入使用constructor-arg标签作为标识。同样具有于属性注入相同的方式,使用name、ref、value作为构造器注入的属性,如下:
XML/HTML代码
- <!--构造器注入-->
- <constructor-arg name="argPerson" ref="person"/>
- <constructor-arg name="intProp" value="1"/>
程序的代码如下:
C#代码
- public class Person
- {
- public string Name { get; set; }
- public int Age { get; set; }
- public Person Friend { get; set; }
- }
C#代码
- public class PersonDao
- {
- private Person argPerson;
- private int intProp;
- public PersonDao(Person argPerson, int intProp)
- {
- this.argPerson = argPerson;
- this.intProp = intProp;
- }
- public void Get()
- {
- //构造函数注入的整型参数
- Console.WriteLine(string.Format("intProp:{0}", intProp));
- //构造函数注入的Person
- Console.WriteLine(string.Format("argPerson Name:{0}", argPerson.Name));
- Console.WriteLine(string.Format("argPerson Age:{0}", argPerson.Age));
- //内联对象Friend
- Console.WriteLine(string.Format("argPerson Friend Name:{0}", argPerson.Friend.Name));
- Console.WriteLine(string.Format("argPerson Friend Age:{0}", argPerson.Friend.Age));
- //内联对象的循环引用
- Console.WriteLine(string.Format("argPerson Friend Friend Name:{0}", argPerson.Friend.Friend.Name));
- Console.WriteLine(string.Format("argPerson Friend Friend Age:{0}", argPerson.Friend.Friend.Age));
- }
- }
XML/HTML代码
- <?xml version="1.0" encoding="utf-8" ?>
- <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>
- <spring>
- <context>
- <resource uri="config://spring/objects" />
- </context>
- <objects xmlns="http://www.springframework.net">
- <object id="person" type="SpringNetDi.Person, SpringNetDi">
- <!--属性值类型注入-->
- <property name="Name" value="lywill"/>
- <property name="Age" value="30"/>
- <!--内联对象注入-->
- <property name="Friend">
- <object type="SpringNetDi.Person, SpringNetDi">
- <property name="Name" value="lyvenus"/>
- <property name="Age" value="29"/>
- <property name="Friend" ref="person"/>
- </object>
- </property>
- </object>
- <object id="personDao" type="SpringNetDi.PersonDao, SpringNetDi">
- <!--构造器注入-->
- <constructor-arg name="argPerson" ref="person"/>
- <constructor-arg name="intProp" value="1"/>
- </object>
- </objects>
- </spring>
- </configuration>
C#代码
- class Program
- {
- static void Main(string[] args)
- {
- IApplicationContext ctx = ContextRegistry.GetContext();
- PersonDao dao = ctx.GetObject("personDao") as PersonDao;
- dao.Get();
- Console.ReadLine();
- }
- }
输出效果如下: