多数情况下,容器会根据对象定义中的type属性值去直接调用相应类型的某个构造器。另外,还可以调用工厂方法来创建对象。(Spring.net中文手册)
实例参考。
(1) Order类
namespace IocTest.Entities
{
public class Order
{
public int Unid { get; set; }
public string OrderName { get; set; }
public string UserId { get; set; }
public override string ToString()
{
return OrderName + ":" + Unid;
}
}
}
(一) 构造器
使用构造器时,不要求对象的特定类型,只要声明对象的类型(assembly)就可以了。方法如下:
1.指明对象类型 type="类全名,程序集名"
2.有一个无参的构造函数或者默认构造函数。
①Xml
<object id="orderConstructor" type="IocTest.Entities.Order"></object>
②Test
[Test(Description="constructor test")]
public void TestOrderConstructor()
{
Order oo = XmlFactory.GetObject("orderConstructor") as Order;
oo.OrderName = "constructor create Test order name";
Console.WriteLine(oo.ToString());
}
(二) 静态工厂
使用静态工厂方法创建对象时,除了要将对象定义的type属性设为包含静态工厂方法的类型外,还要设置一个名为factory-method的属性来指定静态工厂方法的名称。(Spring.net中文手册)
① Xml
<!-- static facotry order-->
<object id="OrderFactoryStatic" type="IocTest.Entities.OrderFactory"
factory-method="CreateStaticInstance">
</object>
此对象type指定的是静态工厂类型,此对象的作用即为静态创建Order类
② OrderFactory类
namespace IocTest.Entities
{
public class OrderFactory
{
public static Order CreateStaticInstance()
{
return new Order();
}
public Order CreateInstance()
{
return new Order();
}
}
}
③ Test
[Test(Description="static factory")]
public void TestStaticFactory()
{
Order oo = XmlFactory.GetObject("OrderFactoryStatic") as Order;
oo.OrderName = "static factory create Test order name";
Console.WriteLine(oo.ToString());
}
(三) 实例工厂
通过实例工厂方法创建对象与通过静态工厂方法创建对象的配置方式类似。此时,实例工厂方法所在的对象必须也要配置在同一容器(或父容器)中。
如果要通过实例工厂方法创建对象,对象定义就不能包含type属性,而要用factory-object属性引用工厂方法所在的对象;注意,该属性值必须是包含工厂方法的对象的名称,且该对象必须定义在当前容器或父容器中。工厂方法的方法名则通过factory-method属性指定。(Spring.net中文手册)
① Xml
<!-- factory order instance-->
<object id="OrderFactorySample" type="IocTest.Entities.OrderFactory">
</object>
<object id="OrderFactoryInstance" type="IocTest.Entities.OrderFactory"
factory-method="CreateInstance"
factory-object="OrderFactorySample">
</object>
② Test
[Test(Description = "instance factory test")]
public void TestInstanceFactory()
{
Order oo = XmlFactory.GetObject("OrderFactoryInstance") as Order;
oo.OrderName = "instance factory create Test order name";
Console.WriteLine(oo.ToString());
}
(四) 泛型类型
与普通对象相同。但要注意的是左尖括号要以<来代替,右尖括号不用。
Score<T> 类
namespace IocTest.Entities
{
public class Score<T>
{
public int Unid { get; set; }
public List<T> ScoreList { get; set; }
public override string ToString()
{
string strReturn = string.Empty;
foreach (T t in ScoreList)
strReturn += t.ToString();
return strReturn;
}
}
}
① Xml
<!--generic test-->
<object id="Score" type="IocTest.Entities.Score<int>">
</object>
② Test
[Test]
public void TestGenericScore()
{
Score<int> cc=XmlFactory.GetObject("Score") as Score<int>;
List<int> _list = new List<int>() { 11,2,66,9,0};
cc.ScoreList = _list;
Console.WriteLine(cc.ToString());
}