天天看點

Spring.Net入門篇(一)

簡介 

    從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資訊如下:

Spring.Net入門篇(一)

<? xml version="1.0" encoding="utf-8"  ?>

Spring.Net入門篇(一)

< configuration >

Spring.Net入門篇(一)
Spring.Net入門篇(一)

   < configSections >

Spring.Net入門篇(一)

     < sectionGroup  name ="spring" >

Spring.Net入門篇(一)

       < section  name ="context"  type ="Spring.Context.Support.ContextHandler, Spring.Core" />

Spring.Net入門篇(一)

       < section  name ="objects"  type ="Spring.Context.Support.DefaultSectionHandler, Spring.Core"   />

Spring.Net入門篇(一)

     </ sectionGroup >

Spring.Net入門篇(一)

   </ configSections >

Spring.Net入門篇(一)

   < spring >

Spring.Net入門篇(一)

     < context >

Spring.Net入門篇(一)

       < resource  uri ="config://spring/objects" />

Spring.Net入門篇(一)

     </ context >

Spring.Net入門篇(一)

     < objects  xmlns ="http://www.springframework.net" >

Spring.Net入門篇(一)
Spring.Net入門篇(一)

     </ objects >

Spring.Net入門篇(一)

   </ spring >

Spring.Net入門篇(一)

</ configuration >

 objects标簽是我們配置加載對象的地方。

  加載對象

    看過PetShop源代碼的人對這項功能可能很熟悉,不再累述,舉例說明:

    以下代碼加載Speaker類。

   Speaker 類的代碼。

Spring.Net入門篇(一)

using  System;

Spring.Net入門篇(一)

using  System.Collections.Generic;

Spring.Net入門篇(一)

using  System.Text;

Spring.Net入門篇(一)
Spring.Net入門篇(一)

namespace  SpringExample

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

{

Spring.Net入門篇(一)

    public class Speaker

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

{

Spring.Net入門篇(一)

        private string _name = "Not Modify";

Spring.Net入門篇(一)
Spring.Net入門篇(一)

        public string Name

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

{

Spring.Net入門篇(一)
Spring.Net入門篇(一)

            get 

Spring.Net入門篇(一)

{ return _name; }

Spring.Net入門篇(一)
Spring.Net入門篇(一)

            set 

Spring.Net入門篇(一)

{ _name = value; }

Spring.Net入門篇(一)

        }

Spring.Net入門篇(一)

        private IName _nameInterface;

Spring.Net入門篇(一)

        public Speaker()

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

{

Spring.Net入門篇(一)
Spring.Net入門篇(一)

        }

Spring.Net入門篇(一)

        public Speaker(string name)

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

{

Spring.Net入門篇(一)

            _name = name;

Spring.Net入門篇(一)

        }

Spring.Net入門篇(一)

        public IName NameInterface

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

{

Spring.Net入門篇(一)
Spring.Net入門篇(一)

            set 

Spring.Net入門篇(一)

{ _nameInterface = value; }

Spring.Net入門篇(一)
Spring.Net入門篇(一)

            get 

Spring.Net入門篇(一)

{ return _nameInterface; }

Spring.Net入門篇(一)

        }

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

    }

Spring.Net入門篇(一)

}

Spring.Net入門篇(一)

按照以下步驟加載Speaker類。

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

Spring.Net入門篇(一)

< object  name ="Speaker"       type ="SpringExample.Speaker, SpringExample" >

Spring.Net入門篇(一)

  </ object >

2.以下為調用代碼

Spring.Net入門篇(一)

using  Spring.Context;

Spring.Net入門篇(一)

using  Spring.Context.Support;

Spring.Net入門篇(一)
Spring.Net入門篇(一)

     private   void  button1_Click( object  sender, EventArgs e)

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

{

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

            IApplicationContext ctx = ContextRegistry.GetContext();

Spring.Net入門篇(一)

            Speaker speaker = (Speaker)ctx.GetObject("Speaker");

Spring.Net入門篇(一)

            MessageBox.Show(speaker.Name);

Spring.Net入門篇(一)

        }

 執行結果為“No Modify”

 屬性注入和構造函數注入

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

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

    以下為IName和NameImpl類的代碼。

Spring.Net入門篇(一)

using  System;

Spring.Net入門篇(一)

using  System.Collections.Generic;

Spring.Net入門篇(一)

using  System.Text;

Spring.Net入門篇(一)
Spring.Net入門篇(一)

namespace  SpringExample

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

{

Spring.Net入門篇(一)

    public interface IName

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

{

Spring.Net入門篇(一)

        string MyName();

Spring.Net入門篇(一)

    }

Spring.Net入門篇(一)

}

Spring.Net入門篇(一)
Spring.Net入門篇(一)

using  System;

Spring.Net入門篇(一)

using  System.Collections.Generic;

Spring.Net入門篇(一)

using  System.Text;

Spring.Net入門篇(一)
Spring.Net入門篇(一)

namespace  SpringExample

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

{

Spring.Net入門篇(一)

    public class NameImpl:IName

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

{

Spring.Net入門篇(一)
Spring.Net入門篇(一)

        IName Members#region IName Members

Spring.Net入門篇(一)
Spring.Net入門篇(一)

        public string MyName()

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

{

Spring.Net入門篇(一)

            return "From Spring";

Spring.Net入門篇(一)

        }

Spring.Net入門篇(一)
Spring.Net入門篇(一)

        #endregion

Spring.Net入門篇(一)

    }

Spring.Net入門篇(一)

}

Spring.Net入門篇(一)

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

Spring.Net入門篇(一)

       < object  name ="Speaker"       type ="SpringExample.Speaker, SpringExample" >

Spring.Net入門篇(一)

         < property  name ="NameInterface"  ref ="Impl" />

Spring.Net入門篇(一)

       </ object >

Spring.Net入門篇(一)

       < object  name ="Impl"         type ="SpringExample.NameImpl, SpringExample" >

Spring.Net入門篇(一)

       </ object >

 2.調用代碼如下:

Spring.Net入門篇(一)

using  Spring.Context;

Spring.Net入門篇(一)

using  Spring.Context.Support;

Spring.Net入門篇(一)
Spring.Net入門篇(一)

   private   void  button3_Click( object  sender, EventArgs e)

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

{

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

            IApplicationContext ctx = ContextRegistry.GetContext();

Spring.Net入門篇(一)

            Speaker speaker = (Speaker)ctx.GetObject("Speaker");

Spring.Net入門篇(一)

            MessageBox.Show(speaker.NameInterface.MyName());

Spring.Net入門篇(一)

        }

  執行結果是"From Spring".

 構造函數注入:

    注意看Speaker類有一個含有一個參數的構造函數,我們這次要配置該參數的值由配置檔案傳入。

  1.配置App.Config,為Speaker類的構造函數傳入參數。

Spring.Net入門篇(一)

< object  name ="Speaker"       type ="SpringExample.Speaker, SpringExample" >

Spring.Net入門篇(一)

         < constructor-arg  index ="0"  value ="From Construct" />

Spring.Net入門篇(一)
Spring.Net入門篇(一)

       </ object >

 2.調用代碼如下:

Spring.Net入門篇(一)

using  Spring.Context;

Spring.Net入門篇(一)

using  Spring.Context.Support;

Spring.Net入門篇(一)
Spring.Net入門篇(一)

  private   void  button2_Click( object  sender, EventArgs e)

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

{

Spring.Net入門篇(一)
Spring.Net入門篇(一)
Spring.Net入門篇(一)

            IApplicationContext ctx = ContextRegistry.GetContext();

Spring.Net入門篇(一)

            Speaker speaker = (Speaker)ctx.GetObject("Speaker");

Spring.Net入門篇(一)

            MessageBox.Show(speaker.Name);

Spring.Net入門篇(一)

        }

執行結果為: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>

繼續閱讀