Autowire标签不起作用

时间:2013-04-09 10:59:01

标签: dependency-injection spring.net autowired

我正在学习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注释有关(我没有尝试过这个注释)。

你们当中有没有人知道问题在哪里?

1 个答案:

答案 0 :(得分:1)

您的第一个参考实际上是一本关于Java版本的Spring的书。 Spring.net是Spring for Java框架的.net端口,有许多相似之处,但也存在一些差异。 spring.net上的文档位于www.springframework.net/

根据the docs on autowiring

  

[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>