Spring.Net 技術簡介 IOC and DI


一 簡單介紹

    
      IOC 控制轉移,就是將創建放到容器里,從而達到接耦合的目的,DI是 在容器創建對象的時候,DI讀取配置文件,然后給對象賦默認值,兩者一般結合使用,實現注入。
     Spring.Net的功能:自動裝配、屬性和構造器參數依賴注入、依賴檢查、生命周期接口等等,使用起來感覺更多的是配置,非常關鍵的就是App.Config配置文件
     技術使用的場景:在需要進行模塊之間解耦操作的時候可以用到,一般的解耦操作用的都是面向接口編程,從而達到模塊之間的解耦,解耦的意思就是:即使下一級模塊修改后,依賴它的上一級模塊也不需要改變,這就是解耦了。通常的做法,其中一種做法是,先抽象下一級模塊的接口,在下一級模塊和上一級模塊之間創建一個工廠模塊,上一級使用下一級抽象出的接口進行編程,實例使用工廠模塊進行實例。工廠模塊實例的方法有很多,簡單的是直接實例,高級的是通過反射進行實例。具體可以在工廠模式中了解,之后也會針對幾種設計模式寫博文,緊急需要的可以給我留言,可以將我的個人總結發給你先。
     從上面的介紹,這個方法其實挺麻煩的,而使用spring.net則相對簡單很多,簡單配置就可以達到效果。
     本文只是入門,更深入的學習請通過API文檔進行詳細學習。
     關於Spring.Net的缺點也是不得不提到的,Spring.Net本質畢竟還是反射,性能方面會有些損失,不適合對性能要求高的大訪問量的互聯網項目,不過在企業級應用中,OA系統,HR系統,都是完全沒有問題的,以及訪問量中等的,起碼幾千人在線訪問,也不是有很大問題,具體使用,需要斟酌。
 

二 創建對象,以及設置屬性

     下載好Spring.Net,新建項目
     一般在目錄下 \Spring.NET-2.0.0-M1\Spring.NET\bin\net\4.0\release,下面是一堆得dll,下面就可以可是新建項目測試了
     新建一個控制台
    主要使用 Common.Logging.dll 日志,Spring.Core.dll 核心庫
     
創建好了項目,然后我們就要開始了
     先修改App.config
   
  <? xml version =" 1.0 " encoding =" utf-8 " ?>
< configuration>
  < configSections>
    < sectionGroup name = "spring " >
      <!-- 這下面有context和object在下面都有對象的標簽 -->
      < section name = "context " type = "Spring.Context.Support.ContextHandler, Spring.Core " />
      < section name = "objects " type = "Spring.Context.Support.DefaultSectionHandler, Spring.Core " />
    </ sectionGroup >
  </ configSections>
 
  < spring>
    <!-- Spring.Net對象容器的配置 -->
    < context >
      <!-- 容器的所有的對象在哪里,這里用uri說明地址 -->
      < resource uri = "config://spring/objects " />
      <!-- 可以使用外部xml文件 -->
 
    </ context >
 
    <!-- objects:配置的容器里面的對象 -->
    < objects xmlns = "http://www.springframework.net " >
      < description >An  example that demonstrates simple IoC features. </ description>
      <!-- name最好用類名,type第一個是類的全稱加上程序集,后面一個是項目名稱 -->
      < object name = "UserInfoDal " type = "SpringNetDemo.UserInfoDal, SpringNetDemo " >
        <!-- 在這里是設置對象的屬性,將Name的值設置成ctt -->
        < property name = "Name " value = "ctt " />
      </ object >
    </ objects >
 
  </ spring>
 
</ configuration>

 

 這里注意:配置放在<startup>標簽后面會報錯 “Spring.Context.Support.ContextRegistry”的類型初始值設定項引發異常,放在<startup>標簽前面就可以了。
 
     public class UserInfoDal : IUserInfoDal
    {
        public string Name { get; set; }
 
        public void Show()
        {
            Console .WriteLine("zjh  and  "+Name );
        }
    }

 

Program里面
class Program
{
    static void Main(string [] args)
    {
        //IApplicationContext是Spring里面的一個超類,主要操作類
        IApplicationContext ctx = ContextRegistry .GetContext();
        //GetObject從配置文件中讀取信息后,反射產生相應的對象,用as強轉成對象的接口
        IUserInfoDal userInfoDal = ctx.GetObject("UserInfoDal" ) as IUserInfoDal;
        //輕松加愉快,就這樣出來了
       userInfoDal.Show(); 
     Console .ReadKey();
    }
}

 

結果  zjh  and  ctt
 

三 創建復雜屬性的設置

      創建一個服務測試類
public class UserInfoService
{
    public IUserInfoDal UserInfoDal { get ; set; }
 
    public void Show()
    {
        UserInfoDal.Show();
        Console .WriteLine("it is service" );
    }
}

 

 
     配置文件配置
 
<? xml version =" 1.0 " encoding =" utf-8 " ?>
< configuration>
  < configSections>
    < sectionGroup name = "spring " >
      <!-- 這下面有context和object在下面都有對象的標簽 -->
      < section name = "context " type = "Spring.Context.Support.ContextHandler, Spring.Core " />
      < section name = "objects " type = "Spring.Context.Support.DefaultSectionHandler, Spring.Core " />
    </ sectionGroup >
  </ configSections>
 
  < spring>
    <!-- Spring.Net對象容器的配置 -->
    < context >
      <!-- 容器的所有的對象在哪里,這里用uri說明 -->
      < resource uri = "config://spring/objects " />
      <!-- 可以使用外部xml文件 -->
 
    </ context >
 
    <!-- objects:配置的容器里面的對象 -->
    < objects xmlns = "http://www.springframework.net " >
      < description >An  example that demonstrates simple IoC features. </ description>
      <!-- name最好用類名,type第一個是類的全稱加上程序集,后面一個是項目名稱 -->
      < object name = "UserInfoDal " type = "SprintNetDemo.UserInfoDal, SprintNetDemo " >
        <!-- 在這里是設置對象的屬性,將Name的值設置成ctt -->
        < property name = "Name " value = "ctt " />
      </ object >
      <!-- 在這里配置UserInfoService對象 -->
      < object name = "UserInfoService " type = "SprintNetDemo.UserInfoService, SprintNetDemo " >
        <!-- 在這里配置UserInfoService對象的UserInfoDal屬性,執行上面產生的對象 -->
        < property name = "UserInfoDal " ref = "UserInfoDal " />
      </ object >
    </ objects >
 
  </ spring>
 
</ configuration>

 

 
program代碼
 
static void Main( string[] args)
{
    //IApplicationContext是Spring里面的一個超類,主要操作類
    IApplicationContext ctx = ContextRegistry .GetContext();
    //創建出對象,主要在配置文件中對UserInfoService的UserInfoDal屬性進行復制
    UserInfoService userInfoService = ctx.GetObject( "UserInfoService" ) as UserInfoService;
    userInfoService.Show();
    Console.ReadKey();
}

 

 
結果
zjh  and  ctt
it is service
 

四 總結

 
     本文主要,簡單地講解了一些Spring.Net的例子,我這次也是項目中用到了,將自己的一些使用心得寫出來,雖然例子比較簡單,但是還是可以看出Spring.Net的強大之處,當然這里介紹的只是冰山一角。
     Spring.Net的中文文檔,2007就沒有再更新過了,如果大家想進一步學習,推薦閱讀英文文檔,當然英文不太好,閱讀java的spring一樣樣的,嘿嘿,java有中文文檔喲。
  如果有錯誤,歡迎指出來,謝謝。
 
 
 
 
 
 
 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM