Spring.Net入門篇(一)

NO IMAGE

簡介 
 
    從OO到AOP,一路走來就是眼花繚亂的術語,矇蔽了這些東西的本來面目。如果你還在駐足,那你就該嘗試著看看這個軟體開發的世界裡,是誰在狂歡!

     Martin Fowler 很大師,兩篇論文就搞的開發界雞飛狗跳、雞犬不寧。一篇當然是《Inversion of Control Containers and the Dependency Injection pattern》 (04年 控制反轉和依賴注入) ,另一篇則是《Continuous Integration》(06年 持續整合)。如果提這兩篇論文,則不能不說在.net開發中與之相關的框架或者工具:Spring.Net和CruiseControl.Net,而前一個也是我們要學習的物件。

    八卦:中國的體制怎麼沒有催生出寫這些論文的人呢,論文不必是該死的教授才能寫的吧!
    再八卦:題外的話,研究一個人的東西先要看他的擁有技能和所處環境,否則Context就不對了。對於Martin Fowler.我只能說深入OO,到設計模式,到重構,到測試驅動,到敏捷程式設計。一路下來,再認識認識Kent Beck,Rod Johnson 。想必收穫不小。

  
      Spring.Net“翻譯”自Java版本的Spring。這篇文章展示一些基本問題,關於理論性的東西最好去讀讀上面推薦的論文,不做累述。

   環境配置

    1.下載最新的框架Spring.Net 1.1.1. 並安裝。
    2.新建測試的Windows Application 程式。 引用Spring.Core.dll到工程下。
    3.增加配置檔案App.Config,配置Spring.Net資訊如下:

   

<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>

  <configSections>
    <sectionGroup name=”spring”>
      <section name=”context” type=”Spring.Context.Support.ContextHandler, Spring.Core”/>
      <section name=”objects” type=”Spring.Context.Support.DefaultSectionHandler, Spring.Core” />
    </sectionGroup>
  </configSections>
  <spring>
    <context>
      <resource uri=”config://spring/objects”/>
    </context>
    <objects xmlns=”http://www.springframework.net”>
      
    </objects>
  </spring>
</configuration>

 objects標籤是我們配置載入物件的地方。

  載入物件

    看過PetShop原始碼的人對這項功能可能很熟悉,不再累述,舉例說明:
   
    以下程式碼載入Speaker類。
   
   Speaker 類的程式碼。

using System;
using System.Collections.Generic;
using System.Text;

namespace SpringExample
{
    public class Speaker
    {
        private string _name = “Not Modify”;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        private IName _nameInterface;
        public Speaker()
        {
 
        }
        public Speaker(string name)
        {
            _name = name;
        }
        public IName NameInterface
        {
            set { _nameInterface = value; }
            get { return _nameInterface; }
        }

        
    }
}

按照以下步驟載入Speaker類。

1.在App.Config中配置Speaker 類的資訊,注意在objects標籤下。

<object name=”Speaker”      type=”SpringExample.Speaker, SpringExample”>
 </object>

2.以下為呼叫程式碼

using Spring.Context;
using Spring.Context.Support;

    private void button1_Click(object sender, EventArgs e)
        {
            /**//*普通呼叫*/
            IApplicationContext ctx = ContextRegistry.GetContext();
            Speaker speaker = (Speaker)ctx.GetObject(“Speaker”);
            MessageBox.Show(speaker.Name);
        }

 執行結果為“No Modify”

 屬性注入和建構函式注入

     注入方式有幾種,可以參考Rod Johnson的《Spring框架高階程式設計》(Java)。 這裡只以上述兩種方式舉例。

     Speaker類的NameInterface屬性是獲取IName這樣的介面,我們可以在Spring.Net中配置資訊,讓Speaker建立後就已經有了一個可以使用的IName介面。

    以下為IName和NameImpl類的程式碼。
 

using System;
using System.Collections.Generic;
using System.Text;

namespace SpringExample
{
    public interface IName
    {
        string MyName();
    }
}

   

using System;
using System.Collections.Generic;
using System.Text;

namespace SpringExample
{
    public class NameImpl:IName
    {
        IName Members#region IName Members

        public string MyName()
        {
            return “From Spring”;
        }

        #endregion
    }
}

    
 1.配置App.Config,為Speaker類的NameInteface屬性注入NameImpl類。
 
   

      <object name=”Speaker”      type=”SpringExample.Speaker, SpringExample”>
        <property name=”NameInterface” ref=”Impl”/>
      </object>
      <object name=”Impl”        type=”SpringExample.NameImpl, SpringExample”>
      </object>

 2.呼叫程式碼如下:

 

using Spring.Context;
using Spring.Context.Support;

  private void button3_Click(object sender, EventArgs e)
        {
            /**//*屬性注入*/
            IApplicationContext ctx = ContextRegistry.GetContext();
            Speaker speaker = (Speaker)ctx.GetObject(“Speaker”);
            MessageBox.Show(speaker.NameInterface.MyName());
        }

  執行結果是”From Spring”.

 建構函式注入:

    注意看Speaker類有一個含有一個引數的建構函式,我們這次要配置該引數的值由配置檔案傳入。
   
  1.配置App.Config,為Speaker類的建構函式傳入引數。
 

<object name=”Speaker”      type=”SpringExample.Speaker, SpringExample”>
        <constructor-arg index=”0″ value=”From Construct”/>
     
      </object>

   
 2.呼叫程式碼如下:

using Spring.Context;
using Spring.Context.Support;

 private void button2_Click(object sender, EventArgs e)
        {
            /**//*構造注入*/
            IApplicationContext ctx = ContextRegistry.GetContext();
            Speaker speaker = (Speaker)ctx.GetObject(“Speaker”);
            MessageBox.Show(speaker.Name);
        }

執行結果為:From Consturct

   好了剩下的就是大家舉一反三,從三到萬了。

 

http://www.cnblogs.com/lwlzyjl/archive/2008/04/18/1159712.html

程式還需要引用antlr.runtime程式集

IApplicationContext ctx = ContextRegistry.GetContext()中出現問題:

1.”Spring.Context.Support.ContextRegistry”的型別初始值設定項引發異常” 沒有引用Common.Logging.dll

2.Error creating context ‘spring.root’: 元素 名稱空間“http://www.springframework.net”中的“object”。 的子元素 名稱空間“http://www.springframework.net”中的“constructor-arg”。 無效。應為可能元素的列表: 名稱空間“http://www.springframework.net”中的“property, lookup-method, replaced-method, listener”。

原因:App.Config中constructor-arg 配置要要放在屬性前面。

<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
  <configSections>
    <sectionGroup name=”spring”>
      <section name=”context” type=”Spring.Context.Support.ContextHandler, Spring.Core”/>
      <section name=”objects” type=”Spring.Context.Support.DefaultSectionHandler, Spring.Core” />
    </sectionGroup>
  </configSections>
  <spring>
    <context>
      <resource uri=”config://spring/objects”/>
    </context>
    <objects xmlns=”http://www.springframework.net“>
      <object name=”Speaker” type=”TestSpring.Speaker, TestSpring”>
        <constructor-arg index=”0″ value=”From Construct”/>
        <property name=”NameInterface” ref=”Impl”/>    
      </object>
      <object name=”Impl” type=”TestSpring.NameImpl, TestSpring”>
      </object>
    </objects>   
  </spring>
</configuration>