我正在学习Spring.Net。我做了一个例子来理解标签autowire,但它不起作用。在我的课程下面:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Spring.Context;
using Spring.Context.Support;
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
IApplicationContext context;
context = new XmlApplicationContext("spring.xml");
Texte texte = null;
texte = (Texte)context.GetObject("texte");
texte.print();
Console.ReadKey();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication6
{
class Texte
{
private String _t;
private Description _desc;
public String T
{
get { return _t; }
set { _t = value; }
}
internal Description Desc
{
get { return _desc; }
set { _desc = value; }
}
public void print()
{
Console.WriteLine("text in object: " + _t);
Console.WriteLine("text description: " + _desc.D);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication6
{
class Description
{
private String _d;
public String D
{
get { return _d; }
set { _d = value; }
}
}
}
这里是我的xml文件:
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">
<object id = "texte" type = "ConsoleApplication6.Texte" autowire="byName">
<property name = "_t" value = "I am the Text"/>
</object>
<object id = "_desc" type = "ConsoleApplication6.Description">
<property name = "_d" value = "I am the description"/>
</object>
</objects>
Text对象是instanciated但似乎我的对象描述没有实例化。
我阅读了文档并检查了所有可以找到的文档: http://springindepth.com/book/in-depth-ioc-autowiring.html http://www.berchtel.com/archive/diplomathesis/html/05.4-spring_.net.html
我还检查了与autowire相关的stackoverflow中的所有问题,但是大多数问题与autowire注释有关(我没有尝试过这个注释)。
你们当中有没有人知道问题在哪里?
答案 0 :(得分:1)
您的第一个参考实际上是一本关于Java版本的Spring的书。 Spring.net是Spring for Java框架的.net端口,有许多相似之处,但也存在一些差异。 spring.net上的文档位于www.springframework.net/。
[Spring.net]将寻找一个名称与之完全相同的对象 需要自动装配的财产。例如,如果你有 按名称设置为自动装配的对象定义,它包含一个 Master属性,Spring.NET将寻找一个名为的对象定义 掌握,并将其用作对象上Master属性的值 定义
所以我想你必须将你的对象定义改为
<object id = "Desc" type = "ConsoleApplication6.Description">
<property name = "_d" value = "I am the description"/>
</object>
你可能不得不Texte.Desc
public
而不是internal
,但我不确定那个。
的更新强> 的
嗯,这对我有用:
using System;
using NUnit.Framework;
using Spring.Context.Support;
namespace XmlConfig.AutoWireByName
{
[TestFixture]
public class AutoWireByName
{
[Test]
public void LetsAutoWireByName()
{
var ctx = new XmlApplicationContext("AutoWireByName/objects.xml");
var texte = (Texte)ctx.GetObject("texte");
texte.Print();
}
}
class Texte
{
public string T { get; set; }
public Description Desc { get; set; }
public void Print()
{
Console.WriteLine("text in object: " + T);
Console.WriteLine("text description: " + Desc.D);
}
}
class Description
{
public string D { get; set; }
}
}
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">
<object id = "texte" type = "XmlConfig.AutoWireByName.Texte, XmlConfig" autowire="byName">
<property name = "T" value = "I am the Text"/>
</object>
<object id = "Desc" type = "XmlConfig.AutoWireByName.Description, XmlConfig">
<property name = "D" value = "I am the description"/>
</object>
</objects>