spring.net 对象创建 几种情况
多数情况下,容器会根据对象定义中的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());
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述