《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > IoC模式及其應用
IoC模式及其應用
2016年微型機與應用第06期
(沙洲職業工學院,江蘇 張家港 215600)
摘要: IoC是一種優秀的組件解耦模式,而依賴注入是IoC最流行的實現方式。探討了依賴注入的三種不同的實現方式:構造器注入、屬性注入以及接口注入,并介紹了IoC容器Unity的基本使用方法。
Abstract:
Key words :

  周洪斌

 ?。ㄉ持蘼殬I工學院,江蘇 張家港 215600)

      摘要:IoC是一種優秀的組件解耦模式,而依賴注入是IoC最流行的實現方式。探討了依賴注入的三種不同的實現方式:構造器注入、屬性注入以及接口注入,并介紹了IoC容器Unity的基本使用方法。

  關鍵詞依賴倒置原則;控制反轉;依賴注入;Unity

0引言

  2015年江蘇省高校大學生創新創業訓練計劃立項項目(201511288009Y)在使用簡單三層架構開發數據庫應用程序時,一般都是在業務邏輯層直接創建數據訪問層相應的對象,如:

  public class ProductBLL

  {

  SqlServerDAL dal = new SqlServerDAL();

  public int Add(ProductModel model)

  {

  return dal.Add(model);

  }

  }

  這種方式下由調用者ProductBLL主動創建被依賴對象SqlServerDAL,然后調用被依賴對象的方法,導致調用者與被依賴對象實現類的硬編碼耦合,不利于項目的維護與升級。上述緊耦合的業務邏輯層與數據訪問層的關系如圖1所示。

  

001.jpg

  如果用戶需要將數據庫換成Access或者MySQL,需要修改ProductBLL類內部的代碼,違反了開放封閉原則。開放封閉原則要求“軟件實體(類、模塊、函數等)對擴展是開放的,對修改是封閉的”。依賴倒置原則(Dependency Inversion Principle,DIP)要求“高層模塊不應該依賴于低層模塊,兩者應該依賴于抽象”[1]。因此,業務邏輯層的對象不應該直接依賴于數據訪問層的具體實現對象,而應該通過數據訪問層的抽象接口進行訪問,如圖2所示。通過引入抽象,對于高層模塊而言,低層模塊的實現是可替換的。這實際上也是“開放封閉原則”的體現。

  

002.jpg

1控制反轉

  DIP作為一種軟件設計原則,指明了兩個模塊之間應該如何依賴。而控制反轉(Inversion of Control,IoC)則是一種具體的軟件設計模式,明確了如何解除相互依賴的模塊之間的耦合。IoC是指應用本身不負責依賴對象的創建和維護,而交給一個外部容器來完成。這樣就將控制權由應用轉移到了外部,實現了控制權的反轉[2]。IoC的作用在于降低組件之間的耦合度,減少組件之間的依賴關系,提高程序的靈活性和可維護性。

  依賴注入(Dependency Injection,DI)是IoC模式最流行的實現方式,即由外部容器在運行時動態地將依賴的對象注入到組件中。通過依賴注入,業務邏輯層將不再需要直接創建數據訪問層的對象,從而降低了兩者之間的耦合度。

2依賴注入

  依賴注入提供一種機制,將需要依賴(低層模塊)對象的引用傳遞給被依賴(高層模塊)對象。具體的依賴注入可以分為三種形式,即構造器注入、屬性注入以及接口注入[3]。

  2.1構造器注入

  構造器注入,即通過構造方法傳遞依賴。根據依賴倒置原則,高層模塊不應該依賴于低層模塊,兩者應該依賴于抽象。因此構造方法的參數應該是一個抽象類型。

  首先,需要定義一個接口IDataAccess,并在IDataAccess接口中聲明一個Add方法,代碼如下:

  public interface IDataAccess

  {

  int Add(ProductModel model);

  }

  然后,在SqlServerDAL類中,實現IDataAccess接口,代碼如下:

  public class SqlServerDAL:IDataAccess

  {

  public int Add(ProductModel model)

  {

  //省略具體數據庫操作代碼

  }

  }

  接下來,修改ProductBLL類的代碼,代碼如下:

  public class ProductBLL

  {

  private IDataAccess dal;

  //構造器注入

  public ProductBLL(IDataAccess dal)

  {

  this.dal=dal;//傳遞依賴

  }

  public int Add(ProductModel model)

  {

  return dal.Add(model);

  }

  }

  在這里,將依賴對象SqlServerDAL對象的創建和綁定轉移到ProductBLL類的外部來實現,這樣就解除了兩者之間的緊耦合關系。這時,如果要將數據庫換成Access數據庫時,只需定義一個AccessDAL類,實現IDataAccess接口,然后在外部重新綁定依賴,不需要修改ProductBLL類內部代碼即可實現對Access數據庫的操作。

  2.2屬性注入

  屬性注入,即通過屬性來傳遞依賴。因此,首先需要在依賴類ProductBLL中定義一個屬性,代碼如下:

  public class ProductBLL

  {

  private IDataAccess dal;

  //屬性,接受依賴

  public IDataAccess Dal

  {

  set { dal = value; }

  get { return dal; }

  }

  public int Add(ProductModel model)

  {

  return dal.Add(model);

  }

  }

  然后在外部通過給Dal屬性賦值,從而傳遞依賴。

  2.3接口注入

  接口注入需要先定義一個接口,包含一個設置依賴的方法。然后由依賴類繼承并實現這個接口。

  首先定義一個接口,代碼如下:

  public interface IDependent

  {

  void SetDependence(IDataAccess dal);//設置依賴項

  }

  依賴類實現這個接口,代碼如下:

  public class ProductBLL:IDependent

  {

  private IDataAccess dal;

  //實現接口

  public void SetDependence(IDataAccess dal)

  {

  this.dal = dal;

  }

  public int Add(ProductModel model)

  {

  return dal.Add(model);

  }

  }

  外部則通過SetDependence方法傳遞依賴。相比構造器注入和屬性注入,接口注入顯得有些復雜,使用也不常見。

3IoC容器

  3.1IoC容器概述

  一般在小型項目中可以手動創建依賴對象,并將引用傳遞給被依賴模塊。如:

  IDataAccess dal=new SqlServerDAL();//在外部創建依賴對象

  ProductBLL bll=new ProductBLL(dal);//通過構造器注入依賴

  對于大型項目來說,相互依賴的組件比較多,如果還用手動的方式來創建和注入依賴,效率較低。正因如此,IoC容器誕生了。IoC容器實際上是一個依賴注入框架,它包含以下幾個功能:

 ?。?)動態創建、注入依賴對象;

  (2)管理對象生命周期;

 ?。?)映射依賴關系。

  Spring是Java平臺廣泛使用的IoC容器[4],.NET平臺常用的IoC容器包括Unity、Autofac、Spring.NET和Ninject等。Unity是微軟公司推出的一款輕量的、可擴展的依賴注入容器,該項目在Codeplex上的地址為http://unity.codeplex.com,可以下載相應的安裝包和開發文檔[5]。

  3.2Unity應用

  Unity在實際項目中的使用方法如下[6]:

 ?。?)添加對Microsoft.Practices.Unity.dll、Microsoft.Practices.Unity.Configuration.dll以及Microsoft.Practices.Unity.RegistrationByConvention.dll的引用。

 ?。?)在項目配置文件的<configSections>節點下注冊名為unity的section,并在<configuration>節點下添加unity配置信息。配置文件樣例如下:

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

  <configuration>

  <configSections>

  <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>

  </configSections>

  <unity>

  <container name="MyContainer">

  <!--映射關系-->

  <register type="UnityDemo.IDataAccess,UnityDemo"mapTo="UnityDemo.SqlServerDAL,UnityDemo"></register>

  </container>

  </unity>

  <startup>

  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />

  </startup>

  </configuration>

 ?。?)在代碼中讀取配置信息,并將配置載入到UnityContainer中。

  //創建容器

  IUnityContainer container = new UnityContainer();

  //載入配置信息

  container.LoadConfiguration("MyContainer");

  //獲取指定名稱的配置節

  UnityConfigurationSection section

  = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");

  //獲取特定配置節下已命名的配置節<container name='MyContainer'>下的配置信息

  section.Configure(container, "MyContainer");

  //創建實現了IDataAccess接口的對象

  IDataAccess dal = container.Resolve<IDataAccess>();

4結論

  IoC能有效降低組件之間的耦合度,提高程序的靈活性和可擴展性。本文圍繞如何實現業務邏輯層與數據訪問層之間的松散耦合,介紹了構造器注入、屬性注入以及接口注入三種不同的依賴注入方式,并介紹了NET平臺下常用IoC容器Unity的使用,展示了IoC在軟件開發領域的實際應用。

參考文獻

 ?。?] 張逸.軟件設計精要與模式(第2版)[M].北京:電子工業出版社,2010.

 ?。?] 王程,周安琳.基于Autofac對乳制品安全風險預警系統的擴展設計[J].河北省科學院學報,2013,30(1):14.

  [3] 張浩.利用反向控制原則和依賴注入的可復用框架設計解耦方法[J].計算機應用,2010(12):227229.

 ?。?] 周嵐.基于Spring框架的IoC模式的設計和實現[J].合肥學院學報(自然科學版),2011,21(1):4953.

 ?。?] 李鳳桐.微軟企業庫組件Unity使用淺析[J].電腦編程技巧與維護,2015(6):1314.

 ?。?] 蔣金楠.ASP.NET MVC4框架揭秘[M].北京:電子工業出版社,2013.


此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          欧美精品一级| 久久久国产一区二区| 老司机免费视频一区二区| 欧美日韩一区二区三区在线| 亚洲巨乳在线| 欧美国产乱视频| 亚洲大胆美女视频| 伊人成人开心激情综合网| 亚洲视频欧美在线| 久久激情一区| 日韩视频一区二区三区在线播放| 海角社区69精品视频| 亚洲国产欧美日韩精品| 国产伦精品一区二区三区在线观看| 久久躁日日躁aaaaxxxx| 亚洲综合日韩在线| 欧美人与性动交cc0o| 久久久之久亚州精品露出| 国产精品久久久久久久久久免费看| 国产精品免费网站在线观看| 影院欧美亚洲| 久久久免费精品视频| 亚洲欧美日本另类| 亚洲国产专区| 另类春色校园亚洲| 一区二区三区 在线观看视| 日韩亚洲欧美成人| 亚洲大黄网站| 国产精品欧美日韩一区二区| 国产在线精品二区| 樱花yy私人影院亚洲| 亚洲小说春色综合另类电影| 蜜臀va亚洲va欧美va天堂| 亚洲人成欧美中文字幕| 狠狠色狠狠色综合| 欧美精品久久久久久久| 一区二区激情| 日韩一二三在线视频播| 欧美1区3d| 国产亚洲欧美中文| 亚洲午夜在线观看视频在线| 国产精品成人观看视频免费| 亚洲国产精品久久人人爱蜜臀| 亚洲国产成人久久综合| 亚洲免费影视第一页| 在线精品视频在线观看高清| 亚洲福利国产| 在线视频日韩精品| 欧美激情一区二区三区不卡| 亚洲天堂成人在线视频| 99pao成人国产永久免费视频| 亚洲人成网站影音先锋播放| 欧美一区二区日韩一区二区| 欧美激情一区二区三区蜜桃视频| 一区二区三区国产在线| 中文在线资源观看视频网站免费不卡| 久久视频在线免费观看| 欧美精品一区二区三区久久久竹菊| 美女脱光内衣内裤视频久久网站| 国产欧美丝祙| 免费日本视频一区| 亚洲午夜影视影院在线观看| 欧美亚洲三级| 亚洲一级电影| 国产精品爱久久久久久久| 激情视频一区二区三区| 在线观看福利一区| 欧美日韩国产综合视频在线观看| 激情小说亚洲一区| 午夜精品久久久久久久| 欧美精品久久久久久久免费观看| 蜜桃精品久久久久久久免费影院| 国产精品久久久久久久久借妻| 国产专区精品视频| 一区二区在线视频播放| 亚洲一区二区av电影| 久久综合一区二区三区| 久久婷婷亚洲| 国产毛片一区二区| 黑人巨大精品欧美一区二区小视频| 在线观看精品视频| 国产精品亚洲精品| 欧美亚洲视频在线观看| 国产亚洲精品资源在线26u| 国内精品久久久久久影视8| 久久在线视频在线| 欧美日韩一区二区三| 欧美精品一区二区三区一线天视频| 欧美日韩福利| 国产视频亚洲精品| 欧美午夜精品久久久久久孕妇| 欧美破处大片在线视频| 国产精品一区一区三区| 国产欧美精品久久| 国产亚洲一区二区精品| 欧美激情女人20p| 欧美另类视频| 亚洲女爱视频在线| 国产精品久久久久久久久久免费看| 黑人巨大精品欧美一区二区小视频| 欧美成人蜜桃| 国产午夜精品理论片a级大结局| 国产欧美欧洲在线观看| 国产午夜精品美女视频明星a级| 国内精品视频在线观看| 日韩视频一区二区三区| 久久av在线| 亚洲国产精品女人久久久| 中文av字幕一区| 亚洲精品激情| 国产欧美一区二区色老头| 国产区欧美区日韩区| 在线视频欧美日韩| 亚洲香蕉在线观看| 亚洲人体影院| 国产精品日韩在线观看| 美女尤物久久精品| 国产精品成人一区二区网站软件| 亚洲高清免费在线| 国产日韩欧美在线播放| 久久精品国产综合精品| 禁断一区二区三区在线| 久久国产夜色精品鲁鲁99| 国产精品一区=区| 久久高清免费观看| 日韩亚洲在线观看| 欧美日韩另类丝袜其他| 欧美视频一区二区三区…| 精品96久久久久久中文字幕无| 国产精品久久久久久久电影| 亚洲精品亚洲人成人网| 激情欧美一区二区| 亚洲欧美中文字幕| 国产精品久久久一区麻豆最新章节| 国产精品视频免费观看| 国产主播喷水一区二区| 欧美日韩国产123区| 今天的高清视频免费播放成人| 国产精品极品美女粉嫩高清在线| 一区二区三区你懂的| 国产精品欧美经典| 国产日韩精品电影| 亚洲精品一品区二品区三品区| 一区免费在线| 国产亚洲精品bt天堂精选| 欧美激情中文不卡| 欧美激情四色| 欧美在线播放一区| 狼人天天伊人久久| 日韩系列在线| 久久精品中文| 欧美高清日韩| 蜜桃伊人久久| 欧美一区永久视频免费观看| 精品91在线| 老牛嫩草一区二区三区日本| 久久久999精品视频| 久久九九电影| 在线播放国产一区中文字幕剧情欧美| 久久夜色撩人精品| 免费在线观看精品| 国产精品久久久久9999吃药| 亚洲人成7777| 欧美成人r级一区二区三区| 欧美日韩精品免费在线观看视频| 欧美日韩在线大尺度| 国产欧美精品日韩精品| 最新成人av在线| 一区在线视频| 亚洲欧美国产va在线影院| 亚洲黄色高清| 国产一区二区看久久| 久久看片网站| 欧美日韩免费在线观看| 久久久久国产成人精品亚洲午夜| 亚洲激情黄色| 影音先锋久久资源网| 亚洲精品裸体| 国产精品扒开腿做爽爽爽软件| 宅男66日本亚洲欧美视频| 亚洲欧美视频一区二区三区| 免费欧美日韩| 欧美国产日韩一区二区三区| 亚洲最新合集| 欧美一区亚洲二区| 久久精品在这里| 国产精品一卡二| 亚洲欧美在线视频观看| 亚洲午夜精品久久久久久app| 欧美三级视频在线播放| 亚洲激情影视| 午夜久久一区| 在线观看国产日韩| 欧美日韩国产综合视频在线观看| 国产欧美一区视频| 亚洲美女视频| 国产欧美一区二区三区在线老狼| 亚洲免费中文字幕| 久久在线免费观看视频| 国产亚洲在线观看| 中文在线资源观看网站视频免费不卡| 国产精品国产一区二区| 在线亚洲伦理| 欧美精品国产一区二区| 久久国产精品色婷婷| 一区二区日韩伦理片| 一区二区在线观看视频在线观看| 韩国精品一区二区三区| 国产精品久久久久77777| 日韩亚洲欧美成人一区| 欧美午夜不卡在线观看免费| 性xx色xx综合久久久xx| 国产精品永久免费视频| 国产亚洲欧美日韩精品| 欧美国产日韩a欧美在线观看| 久久久91精品国产一区二区三区| 亚洲一区久久久| 久久综合狠狠综合久久综青草| 亚洲美女av在线播放| 欧美日韩一区国产| 亚洲久久一区| 久久婷婷国产综合尤物精品| 国产精品嫩草影院一区二区| 国产精品成av人在线视午夜片| 久久久久久久久久久成人| 在线观看不卡| 国产一区白浆| 蜜桃av久久久亚洲精品| 亚洲三级视频| 久久精品久久综合| 国产欧美日韩免费看aⅴ视频| 亚洲视频电影图片偷拍一区| 亚洲欧美三级伦理| 精品动漫一区二区| 久久久女女女女999久久| 欧美另类极品videosbest最新版本| 国产精品另类一区| 欧美日韩在线播放一区二区| 国产精品免费一区二区三区观看| 亚洲欧美日韩中文播放| 男女精品网站| 久久精品国产69国产精品亚洲| 日韩亚洲欧美一区| 欧美日韩成人一区二区三区| 在线观看欧美精品| 在线天堂一区av电影| 韩日欧美一区二区| 母乳一区在线观看| 欧美日韩一区二区高清| 狠狠色丁香久久婷婷综合丁香| 欧美激情亚洲视频| 国产永久精品大片wwwapp| 欧美日韩一区视频| 99国产精品国产精品毛片| 狠狠色狠狠色综合日日小说| 亚洲欧美成人综合| 中文在线不卡视频| 欧美视频一二三区| 欧美与黑人午夜性猛交久久久| 亚洲视频精选| 久久最新视频| 一本一本久久a久久精品综合麻豆| 国产日韩亚洲欧美综合| 国产精品一区久久久| 亚洲精品久久视频| 国产亚洲va综合人人澡精品| 国产性做久久久久久| 一区二区三区在线视频观看| 国产综合亚洲精品一区二| 欧美日韩成人综合在线一区二区| 99国产精品99久久久久久| 噜噜噜噜噜久久久久久91| 欧美成人r级一区二区三区| 亚洲一区影院| 国产精品私房写真福利视频| 国外成人在线视频| 欧美日韩国产经典色站一区二区三区| 欧美日韩在线一区二区| 国产欧美一二三区| 欧美成人一区二区三区在线观看| 亚洲乱码日产精品bd| 亚洲国产精品久久久久婷婷884| 亚洲肉体裸体xxxx137| 久久免费99精品久久久久久| 久热re这里精品视频在线6| 亚洲欧美视频一区| 久久亚洲私人国产精品va媚药| 欧美成人午夜视频| 欧美一区二区三区在线观看视频| 91久久久一线二线三线品牌| 亚洲精品人人| 一区二区三区精密机械公司| 狠狠综合久久av一区二区老牛| 国产精品视频大全| 亚洲级视频在线观看免费1级| 国产精品www994| 91久久精品视频| 亚洲在线国产日韩欧美| 亚洲国产欧美日韩| 欧美黄色一区二区| 亚洲欧洲一二三| 亚洲人体影院| 欧美精品在线网站| 韩日成人av| 欧美精品激情在线观看| 亚洲高清视频一区| 亚洲精品精选| 欧美激情久久久久久| 欧美性天天影院| 曰本成人黄色| 国内偷自视频区视频综合| 亚洲欧洲一区二区在线播放| 国产精品欧美日韩久久| 亚洲一区国产视频| 国产精品永久免费在线| 欧美一站二站| 亚洲毛片网站| 国产精品成人午夜| 欧美综合激情网| 韩国三级电影一区二区| 久久se精品一区精品二区| 一区二区三区欧美亚洲| 国产九区一区在线| 欧美视频一二三区| 亚洲国产精品久久91精品| 亚洲国产午夜| 小黄鸭精品密入口导航| 国产欧美日韩亚洲|