2013-04-09 189 views
2

我正在學習Spring.Net。我做了一個小例子來理解標籤autowire,但它不起作用。下面我的課: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> 

文本對象被實例化,但似乎我的對象描述不實例化。

我閱讀文檔,我檢查了所有我能找到的文檔: http://springindepth.com/book/in-depth-ioc-autowiring.html http://www.berchtel.com/archive/diplomathesis/html/05.4-spring_.net.html

我還檢查了計算器自動裝配,但其中大部分都與自動裝配註釋相關的所有問題(我做沒有嘗試這個註釋)。

你們中的任何一個人對於問題在哪裏都有想法?

回答

1

您的第一個參考實際上是一本關於Java版Spring的書。 Spring.net是Spring for Java框架的.net端口,具有許多相似之處,但也有一些差異。 spring.net上的文檔是www.springframework.net/

根據the docs on autowiring

[Spring.net]會查找名字完全一樣的 屬性,它需要被裝配的對象。例如,如果您有一個 對象定義被設置爲按名稱自動裝配,並且它包含主屬性 ,則Spring.NET將查找名爲 主對象的對象定義,並將其用作主屬性的值你的對象 的定義。

所以我想你有你的對象定義更改爲

<object id = "Desc" type = "ConsoleApplication6.Description"> 
    <property name = "_d" value = "I am the description"/> 
</object> 

,你可能不得不做出Texte.Descpublic代替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> 
+0

謝謝您的回答,我改變了我的XML文件,您recommandations和設置我的類描述爲公開但錯誤仍然相同: 「對象引用未設置爲對象實例。」 (錯誤發生在「Console.WriteLine(」text description:「+ _desc.D)」行) – 2013-04-10 06:46:55

+0

我在我的答案中添加了一個示例。 – Marijn 2013-04-10 07:23:57

+0

謝謝你@Marijn!它的工作原理,我想我的錯誤是: 1.描述是不是在我指定的私人attribut我的XML文件公開 2,而不是我要再次指定的公共訪問方法 謝謝! – 2013-04-11 08:01:35