久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

依赖注入学习总结

發(fā)布時(shí)間:2025/4/14 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 依赖注入学习总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

控制反轉(zhuǎn)

同義詞 依賴注入一般指控制反轉(zhuǎn)
控制反轉(zhuǎn)(Inversion of Control,英文縮寫為IoC)是框架的重要特征,并非面向?qū)ο缶幊痰膶S眯g(shù)語。它與依賴注入(Dependency Injection,簡(jiǎn)稱DI)和依賴查找(Dependency Lookup)并沒有關(guān)系。
中文名 控制反轉(zhuǎn) 外文名 Inverse of Control 起源時(shí)間 1988年 目 ? ?的 描述框架的重要特征
目錄
1 起源
2 設(shè)計(jì)模式
3 優(yōu)缺點(diǎn)
4 實(shí)現(xiàn)初探
5 類型
6 實(shí)現(xiàn)策略
7 實(shí)現(xiàn)方式
起源
早在1988年,Ralph E. Johnson & Brian Foote在論文Designing Reusable Classes中寫到:
One important characteristic of a framework is that the methods defined by the user to tailor the framework will often be called from within the framework itself, rather than from the user's application code.
The framework often plays the role of the main program in coordinating and sequencing application activity.
This inversion of control gives frameworks the power to serve as extensible skeletons. The methods supplied by the user tailor the generic algorithms defined in the framework for a particular application.
《設(shè)計(jì)模式》至少兩次使用了控制反轉(zhuǎn),[1.6.7設(shè)計(jì)應(yīng)支持變化]和[5.10模板方法模式]。[1]?
2004年,Martin Fowler在其著名文章Inversion of Control Containers and the Dependency Injection pattern中[2] ?,使用了該術(shù)語。
但是,這些使用案例也使得IoC的含義變得含混。
設(shè)計(jì)模式
IoC可以認(rèn)為是一種全新的設(shè)計(jì)模式,但是理論和時(shí)間成熟相對(duì)較晚,并沒有包含在GoF中。
Interface Driven Design接口驅(qū)動(dòng),接口驅(qū)動(dòng)有很多好處,可以提供不同靈活的子類實(shí)現(xiàn),增加代碼穩(wěn)定和健壯性等等,但是接口一定是需要實(shí)現(xiàn)的,也就是如下語句遲早要執(zhí)行:AInterface a = new AInterfaceImp(); 這樣一來,耦合關(guān)系就產(chǎn)生了,如:

classA {AInterface a;A(){}AMethod()//一個(gè)方法{a = new AInterfaceImp();} }

Class A與AInterfaceImp就是依賴關(guān)系,如果想使用AInterface的另外一個(gè)實(shí)現(xiàn)就需要更改代碼了。當(dāng)然我們可以建立一個(gè)Factory來根據(jù)條件生成想要的AInterface的具體實(shí)現(xiàn),即:

InterfaceImplFactory {AInterface create(Object condition){if(condition == condA){return new AInterfaceImpA();}else if(condition == condB){return new AInterfaceImpB();}else{return new AInterfaceImp();}} }

表面上是在一定程度上緩解了以上問題,但實(shí)質(zhì)上這種代碼耦合并沒有改變。通過IoC模式可以徹底解決這種耦合,它把耦合從代碼中移出去,放到統(tǒng)一的XML 文件中,通過一個(gè)容器在需要的時(shí)候把這個(gè)依賴關(guān)系形成,即把需要的接口實(shí)現(xiàn)注入到需要它的類中,這可能就是“依賴注入”說法的來源了。
IoC模式,系統(tǒng)中通過引入實(shí)現(xiàn)了IoC模式的IoC容器,即可由IoC容器來管理對(duì)象的生命周期、依賴關(guān)系等,從而使得應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開。其中一個(gè)特點(diǎn)就是通過文本的配置文件進(jìn)行應(yīng)用程序組件間相互關(guān)系的配置,而不用重新修改并編譯具體的代碼。
當(dāng)前比較知名的IoC容器有:Pico Container、Avalon 、Spring、JBoss、HiveMind、EJB等。
在上面的幾個(gè)IoC容器中,輕量級(jí)的有Pico Container、Avalon、Spring、HiveMind等,超重量級(jí)的有EJB,而半輕半重的有容器有JBoss,Jdon等。
可以把IoC模式看做是工廠模式的升華,可以把IoC看作是一個(gè)大工廠,只不過這個(gè)大工廠里要生成的對(duì)象都是在XML文件中給出定義的,然后利用Java 的“反射”編程,根據(jù)XML中給出的類名生成相應(yīng)的對(duì)象。從實(shí)現(xiàn)來看,IoC是把以前在工廠方法里寫死的對(duì)象生成代碼,改變?yōu)橛蒟ML文件來定義,也就是把工廠和對(duì)象生成這兩者獨(dú)立分隔開來,目的就是提高靈活性和可維護(hù)性。
IoC中最基本的Java技術(shù)就是“反射”編程。反射又是一個(gè)生澀的名詞,通俗的說反射就是根據(jù)給出的類名(字符串)來生成對(duì)象。這種編程方式可以讓對(duì)象在生成時(shí)才決定要生成哪一種對(duì)象。反射的應(yīng)用是很廣泛的,像Hibernate、Spring中都是用“反射”做為最基本的技術(shù)手段。
在過去,反射編程方式相對(duì)于正常的對(duì)象生成方式要慢10幾倍,這也許也是當(dāng)時(shí)為什么反射技術(shù)沒有普遍應(yīng)用開來的原因。但經(jīng)SUN改良優(yōu)化后,反射方式生成對(duì)象和通常對(duì)象生成方式,速度已經(jīng)相差不大了(但依然有一倍以上的差距)。
優(yōu)缺點(diǎn)
IoC最大的好處是什么?因?yàn)榘褜?duì)象生成放在了XML里定義,所以當(dāng)我們需要換一個(gè)實(shí)現(xiàn)子類將會(huì)變成很簡(jiǎn)單(一般這樣的對(duì)象都是實(shí)現(xiàn)于某種接口的),只要修改XML就可以了,這樣我們甚至可以實(shí)現(xiàn)對(duì)象的熱插拔(有點(diǎn)像USB接口和SCSI硬盤了)。
IoC最大的缺點(diǎn)是什么?(1)生成一個(gè)對(duì)象的步驟變復(fù)雜了(事實(shí)上操作上還是挺簡(jiǎn)單的),對(duì)于不習(xí)慣這種方式的人,會(huì)覺得有些別扭和不直觀。(2)對(duì)象生成因?yàn)槭鞘褂梅瓷渚幊?#xff0c;在效率上有些損耗。但相對(duì)于IoC提高的維護(hù)性和靈活性來說,這點(diǎn)損耗是微不足道的,除非某對(duì)象的生成對(duì)效率要求特別高。(3)缺少IDE重構(gòu)操作的支持,如果在Eclipse要對(duì)類改名,那么你還需要去XML文件里手工去改了,這似乎是所有XML方式的缺陷所在。
實(shí)現(xiàn)初探
IOC關(guān)注服務(wù)(或應(yīng)用程序部件)是如何定義的以及他們應(yīng)該如何定位他們依賴的其它服務(wù)。通常,通過一個(gè)容器或定位框架來獲得定義和定位的分離,容器或定位框架負(fù)責(zé):
保存可用服務(wù)的集合
提供一種方式將各種部件與它們依賴的服務(wù)綁定在一起
為應(yīng)用程序代碼提供一種方式來請(qǐng)求已配置的對(duì)象(例如,一個(gè)所有依賴都滿足的對(duì)象), 這種方式可以確保該對(duì)象需要的所有相關(guān)的服務(wù)都可用。
類型
現(xiàn)有的框架實(shí)際上使用以下三種基本技術(shù)的框架執(zhí)行服務(wù)和部件間的綁定:
類型1 (基于接口): 可服務(wù)的對(duì)象需要實(shí)現(xiàn)一個(gè)專門的接口,該接口提供了一個(gè)對(duì)象,可以重用這個(gè)對(duì)象查找依賴(其它服務(wù))。早期的容器Excalibur使用這種模式。
類型2 (基于setter): 通過JavaBean的屬性(setter方法)為可服務(wù)對(duì)象指定服務(wù)。HiveMind和Spring采用這種方式。
類型3 (基于構(gòu)造函數(shù)): 通過構(gòu)造函數(shù)的參數(shù)為可服務(wù)對(duì)象指定服務(wù)。PicoContainer只使用這種方式。HiveMind和Spring也使用這種方式。
實(shí)現(xiàn)策略
IoC是一個(gè)很大的概念,可以用不同的方式實(shí)現(xiàn)。其主要形式有兩種:
◇依賴查找:容器提供回調(diào)接口和上下文條件給組件。EJB和Apache Avalon 都使用這種方式。這樣一來,組件就必須使用容器提供的API來查找資源和協(xié)作對(duì)象,僅有的控制反轉(zhuǎn)只體現(xiàn)在那些回調(diào)方法上(也就是上面所說的 類型1):容器將調(diào)用這些回調(diào)方法,從而讓應(yīng)用代碼獲得相關(guān)資源。
◇依賴注入:組件不做定位查詢,只提供普通的Java方法讓容器去決定依賴關(guān)系。容器全權(quán)負(fù)責(zé)的組件的裝配,它會(huì)把符合依賴關(guān)系的對(duì)象通過JavaBean屬性或者構(gòu)造函數(shù)傳遞給需要的對(duì)象。通過JavaBean屬性注射依賴關(guān)系的做法稱為設(shè)值方法注入(Setter Injection);將依賴關(guān)系作為構(gòu)造函數(shù)參數(shù)傳入的做法稱為構(gòu)造器注入(Constructor Injection)
實(shí)現(xiàn)方式
實(shí)現(xiàn)數(shù)據(jù)訪問層
數(shù)據(jù)訪問層有兩個(gè)目標(biāo)。第一是將數(shù)據(jù)庫引擎從應(yīng)用中抽象出來,這樣就可以隨時(shí)改變數(shù)據(jù)庫—比方說,從微軟SQL變成Oracle。不過在實(shí)踐上很少會(huì)這么做,也沒有足夠的理由未來使用實(shí)現(xiàn)數(shù)據(jù)訪問層而進(jìn)行重構(gòu)現(xiàn)有應(yīng)用的努力。[3]?
第二個(gè)目標(biāo)是將數(shù)據(jù)模型從數(shù)據(jù)庫實(shí)現(xiàn)中抽象出來。這使得數(shù)據(jù)庫或代碼開源根據(jù)需要改變,同時(shí)只會(huì)影響主應(yīng)用的一小部分——數(shù)據(jù)訪問層。這一目標(biāo)是值得的,為了在現(xiàn)有系統(tǒng)中實(shí)現(xiàn)它進(jìn)行必要的重構(gòu)。
模塊與接口重構(gòu)
依賴注入背后的一個(gè)核心思想是單一功能原則(single responsibility principle)。該原則指出,每一個(gè)對(duì)象應(yīng)該有一個(gè)特定的目的,而應(yīng)用需要利用這一目的的不同部分應(yīng)當(dāng)使用合適的對(duì)象。這意味著這些對(duì)象在系統(tǒng)的任何地方都可以重用。但在現(xiàn)有系統(tǒng)里面很多時(shí)候都不是這樣的。[3]?
隨時(shí)增加單元測(cè)試
把功能封裝到整個(gè)對(duì)象里面會(huì)導(dǎo)致自動(dòng)測(cè)試?yán)щy或者不可能。將模塊和接口與特定對(duì)象隔離,以這種方式重構(gòu)可以執(zhí)行更先進(jìn)的單元測(cè)試。按照后面再增加測(cè)試的想法繼續(xù)重構(gòu)模塊是誘惑力的,但這是錯(cuò)誤的。[3]?
使用服務(wù)定位器而不是構(gòu)造注入
實(shí)現(xiàn)控制反轉(zhuǎn)不止一種方法。最常見的辦法是使用構(gòu)造注入,這需要在對(duì)象首次被創(chuàng)建是提供所有的軟件依賴。然而,構(gòu)造注入要假設(shè)整個(gè)系統(tǒng)都使用這一模式,這意味著整個(gè)系統(tǒng)必須同時(shí)進(jìn)行重構(gòu)。這很困難、有風(fēng)險(xiǎn),且耗時(shí)。
========

依賴注入原理(為什么需要依賴注入)

http://blog.csdn.net/coderder/article/details/51897721
目錄(?)[-]
0 前言
1 為什么需要依賴注入
2 依賴注入的實(shí)現(xiàn)方式
21 構(gòu)造函數(shù)注入Contructor Injection
22 setter注入
23 接口注入
3 最后
參考
0. 前言
在軟件工程領(lǐng)域,依賴注入(Dependency Injection)是用于實(shí)現(xiàn)控制反轉(zhuǎn)(Inversion of Control)的最常見的方式之一。本文主要介紹依賴注入原理和常見的實(shí)現(xiàn)方式,重點(diǎn)在于介紹這種年輕的設(shè)計(jì)模式的適用場(chǎng)景及優(yōu)勢(shì)。

1. 為什么需要依賴注入
控制反轉(zhuǎn)用于解耦,解的究竟是誰和誰的耦?這是我在最初了解依賴注入時(shí)候產(chǎn)生的第一個(gè)問題。

下面我引用Martin Flower在解釋介紹注入時(shí)使用的一部分代碼來說明這個(gè)問題。
public class MovieLister {private MovieFinder finder;public MovieLister() {finder = new MovieFinderImpl();}public Movie[] moviesDirectedBy(String arg) {List allMovies = finder.findAll();for (Iterator it = allMovies.iterator(); it.hasNext();) {Movie movie = (Movie) it.next();if (!movie.getDirector().equals(arg)) it.remove();}return (Movie[]) allMovies.toArray(new Movie[allMovies.size()]);}... }public interface MovieFinder {List findAll(); }
我們創(chuàng)建了一個(gè)名為MovieLister的類來提供需要的電影列表,它moviesDirectedBy方法提供根據(jù)導(dǎo)演名來搜索電影的方式。真正負(fù)責(zé)搜索電影的是實(shí)現(xiàn)了MovieFinder接口的MovieFinderImpl,我們的MovieLister類在構(gòu)造函數(shù)中創(chuàng)建了一個(gè)MovieFinderImpl的對(duì)象。

目前看來,一切都不錯(cuò)。但是,當(dāng)我們希望修改finder,將finder替換為一種新的實(shí)現(xiàn)時(shí)(比如為MovieFinder增加一個(gè)參數(shù)表明Movie數(shù)據(jù)的來源是哪個(gè)數(shù)據(jù)庫),我們不僅需要修改MovieFinderImpl類,還需要修改我們MovieLister中創(chuàng)建MovieFinderImpl的代碼。

這就是依賴注入要處理的耦合。這種在MovieLister中創(chuàng)建MovieFinderImpl的方式,使得MovieLister不僅僅依賴于MovieFinder這個(gè)接口,它還依賴于MovieListImpl這個(gè)實(shí)現(xiàn)。 這種在一個(gè)類中直接創(chuàng)建另一個(gè)類的對(duì)象的代碼,和硬編碼(hard-coded strings)以及硬編碼的數(shù)字(magic numbers)一樣,是一種導(dǎo)致耦合的壞味道,我們可以把這種壞味道稱為硬初始化(hard init)。同時(shí),我們也應(yīng)該像記住硬編碼一樣記住,new(對(duì)象創(chuàng)建)是有毒的。

Hard Init帶來的主要壞處有兩個(gè)方面:1)上文所述的修改其實(shí)現(xiàn)時(shí),需要修改創(chuàng)建處的代碼;2)不便于測(cè)試,這種方式創(chuàng)建的類(上文中的MovieLister)無法單獨(dú)被測(cè)試,其行為和MovieFinderImpl緊緊耦合在一起,同時(shí),也會(huì)導(dǎo)致代碼的可讀性問題(“如果一段代碼不便于測(cè)試,那么它一定不便于閱讀。”)。

2. 依賴注入的實(shí)現(xiàn)方式
依賴注入其實(shí)并不神奇,我們?nèi)粘5拇a中很多都用到了依賴注入,但很少注意到它,也很少主動(dòng)使用依賴注入進(jìn)行解耦。這里我們簡(jiǎn)單介紹一下賴注入實(shí)現(xiàn)三種的方式。

2.1 構(gòu)造函數(shù)注入(Contructor Injection)

這是我認(rèn)為的最簡(jiǎn)單的依賴注入方式,我們修改一下上面代碼中MovieList的構(gòu)造函數(shù),使得MovieFinderImpl的實(shí)現(xiàn)在MovieLister類之外創(chuàng)建。這樣,MovieLister就只依賴于我們定義的MovieFinder接口,而不依賴于MovieFinder的實(shí)現(xiàn)了。

public class MovieLister {private MovieFinder finder;public MovieLister(MovieFinder finder) {this.finder = finder;}... }
2.2 setter注入

類似的,我們可以增加一個(gè)setter函數(shù)來傳入創(chuàng)建好的MovieFinder對(duì)象,這樣同樣可以避免在MovieFinder中hard init這個(gè)對(duì)象。

public class MovieLister {s...public void setFinder(MovieFinder finder) {this.finder = finder;} }
2.3 接口注入

接口注入使用接口來提供setter方法,其實(shí)現(xiàn)方式如下。
首先要?jiǎng)?chuàng)建一個(gè)注入使用的接口。

public interface InjectFinder {

? ? void injectFinder(MovieFinder finder);
}

之后,我們讓MovieLister實(shí)現(xiàn)這個(gè)接口。

class MovieLister implements InjectFinder {
? ? ...
? ? public void injectFinder(MovieFinder finder) {
? ? ? this.finder = finder;
? ? }
? ? ...
}
========

淺談依賴注入

http://www.cnblogs.com/yangecnu/p/Introduce-Dependency-Injection.html
最近幾天在看一本名為Dependency Injection in .NET 的書,主要講了什么是依賴注入,使用依賴注入的優(yōu)點(diǎn),以及.NET平臺(tái)上依賴注入的各種框架和用法。在這本書的開頭,講述了軟件工程中的一個(gè)重要的理念就是關(guān)注分離(Separation of concern, SoC)。依賴注入不是目的,它是一系列工具和手段,最終的目的是幫助我們開發(fā)出松散耦合(loose coupled)、可維護(hù)、可測(cè)試的代碼和程序。這條原則的做法是大家熟知的面向接口,或者說是面向抽象編程。

關(guān)于什么是依賴注入,在Stack Overflow上面有一個(gè)問題,如何向一個(gè)5歲的小孩解釋依賴注入,其中得分最高的一個(gè)答案是:

“When you go and get things out of the refrigerator for yourself, you can cause problems. You might leave the door open, you might get something Mommy or Daddy doesn’t want you to have. You might even be looking for something we don’t even have or which has expired.

What you should be doing is stating a need, “I need something to drink with lunch,” and then we will make sure you have something when you sit down to eat.”

映射到面向?qū)ο蟪绦蜷_發(fā)中就是:高層類(5歲小孩)應(yīng)該依賴底層基礎(chǔ)設(shè)施(家長)來提供必要的服務(wù)。

編寫松耦合的代碼說起來很簡(jiǎn)單,但是實(shí)際上寫著寫著就變成了緊耦合。

使用例子來說明可能更簡(jiǎn)潔明了,首先來看看什么樣的代碼是緊耦合。

1 不好的實(shí)現(xiàn)
編寫松耦合代碼的第一步,可能大家都熟悉,那就是對(duì)系統(tǒng)分層。比如下面的經(jīng)典的三層架構(gòu)。

Classic 3-tier architecture

分完層和實(shí)現(xiàn)好是兩件事情,并不是說分好層之后就能夠松耦合了。

1.1 緊耦合的代碼
有很多種方式來設(shè)計(jì)一個(gè)靈活的,可維護(hù)的復(fù)雜應(yīng)用,但是n層架構(gòu)是一種大家比較熟悉的方式,這里面的挑戰(zhàn)在于如何正確的實(shí)現(xiàn)n層架構(gòu)。

假設(shè)要實(shí)現(xiàn)一個(gè)很簡(jiǎn)單的電子商務(wù)網(wǎng)站,要列出商品列表,如下:

product list page

下面就具體來演示通常的做法,是如何一步一步把代碼寫出緊耦合的。

1.1.1 數(shù)據(jù)訪問層

要實(shí)現(xiàn)商品列表這一功能,首先要編寫數(shù)據(jù)訪問層,需要設(shè)計(jì)數(shù)據(jù)庫及表,在SQLServer中設(shè)計(jì)的數(shù)據(jù)庫表Product結(jié)構(gòu)如下:

Product Table?

表設(shè)計(jì)好之后,就可以開始寫代碼了。在Visual Studio 中,新建一個(gè)名為DataAccessLayer的工程,添加一個(gè)ADO.NET Entity Data Model,此時(shí)Visual Studio的向?qū)?huì)自動(dòng)幫我們生成Product實(shí)體和ObjectContext DB操作上下文。這樣我們的 Data Access Layer就寫好了。

Product Entity Model

1.1.2 業(yè)務(wù)邏輯層

表現(xiàn)層實(shí)際上可以直接訪問數(shù)據(jù)訪問層,通過ObjectContext 獲取Product 列表。但是大多數(shù)情況下,我們不是直接把DB里面的數(shù)據(jù)展現(xiàn)出來,而是需要對(duì)數(shù)據(jù)進(jìn)行處理,比如對(duì)會(huì)員,需要對(duì)某些商品的價(jià)格打折。這樣我們就需要業(yè)務(wù)邏輯層,來處理這些與具體業(yè)務(wù)邏輯相關(guān)的事情。

新建一個(gè)類庫,命名為DomainLogic,然后添加一個(gè)名為ProductService的類:

public class ProductService {private readonly CommerceObjectContext objectContext;public ProductService(){this.objectContext = new CommerceObjectContext();}public IEnumerable<Product> GetFeaturedProducts(bool isCustomerPreferred){var discount = isCustomerPreferred ? .95m : 1;var products = (from p in this.objectContext.Productswhere p.IsFeaturedselect p).AsEnumerable();return from p in productsselect new Product{ProductId = p.ProductId,Name = p.Name,Description = p.Description,IsFeatured = p.IsFeatured,UnitPrice = p.UnitPrice * discount};} }
現(xiàn)在我們的業(yè)務(wù)邏輯層已經(jīng)實(shí)現(xiàn)了。

1.1.3 表現(xiàn)層

現(xiàn)在實(shí)現(xiàn)表現(xiàn)層邏輯,這里使用ASP.NET MVC,在Index 頁面的Controller中,獲取商品列表然后將數(shù)據(jù)返回給View。

public ViewResult Index()
{
? ? bool isPreferredCustomer =?
? ? ? ? this.User.IsInRole("PreferredCustomer");


? ? var service = new ProductService();
? ? var products =?
? ? ? ? service.GetFeaturedProducts(isPreferredCustomer);
? ? this.ViewData["Products"] = products;

? ? return this.View();
}
然后在View中將Controller中返回的數(shù)據(jù)展現(xiàn)出來:


<h2>Featured Products</h2>
<div>
<% var products =
? ? ? ? (IEnumerable<Product>)this.ViewData["Products"];
? ? foreach (var product in products)
? ? { %>
? ? <div>
? ? <%= this.Html.Encode(product.Name) %>
? ? (<%= this.Html.Encode(product.UnitPrice.ToString("C")) %>)
? ? </div>
<% } %>
</div>
1.2 分析
現(xiàn)在,按照三層“架構(gòu)”我們的代碼寫好了,并且也達(dá)到了要求。整個(gè)項(xiàng)目的結(jié)構(gòu)如下圖:


?Solution layout


這應(yīng)該是我們通常經(jīng)常寫的所謂的三層架構(gòu)。在Visual Studio中,三層之間的依賴可以通過項(xiàng)目引用表現(xiàn)出來。


1.2.1 依賴關(guān)系圖


現(xiàn)在我們來分析一下,這三層之間的依賴關(guān)系,很明顯,上面的實(shí)現(xiàn)中,DomianLogic需要依賴SqlDataAccess,因?yàn)镈omainLogic中用到了Product這一實(shí)體,而這個(gè)實(shí)體是定義在DataAccess這一層的。WebUI這一層需要依賴DomainLogic,因?yàn)镻roductService在這一層,同時(shí),還需要依賴DataAccess,因?yàn)樵赨I中也用到了Product實(shí)體,現(xiàn)在整個(gè)系統(tǒng)的依賴關(guān)系是這樣的:


Dependency graph in three-tier architecture


1.2.2 耦合性分析


使用三層結(jié)構(gòu)的主要目的是分離關(guān)注點(diǎn),當(dāng)然還有一個(gè)原因是可測(cè)試性。我們應(yīng)該將領(lǐng)域模型從數(shù)據(jù)訪問層和表現(xiàn)層中分離出來,這樣這兩個(gè)層的變化才不會(huì)污染領(lǐng)域模型。在大的系統(tǒng)中,這點(diǎn)很重要,這樣才能將系統(tǒng)中的不同部分隔離開來。


現(xiàn)在來看之前的實(shí)現(xiàn)中,有沒有模塊性,有沒有那個(gè)模塊可以隔離出來呢?,F(xiàn)在添加幾個(gè)新的case來看,系統(tǒng)是否能夠響應(yīng)這些需求:


添加新的用戶界面


除了WebForm用戶之外,可能還需要一個(gè)WinForm的界面,現(xiàn)在我們能否復(fù)用領(lǐng)域?qū)雍蛿?shù)據(jù)訪問層呢?從依賴圖中可以看到,沒有任何一個(gè)模塊會(huì)依賴表現(xiàn)層,因此很容易實(shí)現(xiàn)這一點(diǎn)變化。我們只需要?jiǎng)?chuàng)建一個(gè)WPF的富客戶端就可以。現(xiàn)在整個(gè)系統(tǒng)的依賴圖如下:


WPF client


更換新的數(shù)據(jù)源


可能過了一段時(shí)間,需要把整個(gè)系統(tǒng)部署到云上,要使用其他的數(shù)據(jù)存儲(chǔ)技術(shù),比如Azure Table Storage Service?,F(xiàn)在,整個(gè)訪問數(shù)據(jù)的協(xié)議發(fā)生了變化,訪問Azure Table Storage Service的方式是Http協(xié)議,而之前的大多數(shù).NET 訪問數(shù)據(jù)的方式都是基于ADO.NET 的方式。并且數(shù)據(jù)源的保存方式也發(fā)生了改變,之前是關(guān)系型數(shù)據(jù)庫,現(xiàn)在變成了key-value型數(shù)據(jù)庫。


Azure datatable?


由上面的依賴關(guān)系圖可以看出,所有的層都依賴了數(shù)據(jù)訪問層,如果修改數(shù)據(jù)訪問層,則領(lǐng)域邏輯層,和表現(xiàn)層都需要進(jìn)行相應(yīng)的修改。


1.2.3 問題


除了上面的各層之間耦合下過強(qiáng)之外,代碼中還有其他問題。


領(lǐng)域模型似乎都寫到了數(shù)據(jù)訪問層中。所以領(lǐng)域模型看起來依賴了數(shù)據(jù)訪問層。在數(shù)據(jù)訪問層中定義了名為Product的類,這種類應(yīng)該是屬于領(lǐng)域模型層的。
表現(xiàn)層中摻入了決定某個(gè)用戶是否是會(huì)員的邏輯。這種業(yè)務(wù)邏輯應(yīng)該是 業(yè)務(wù)邏輯層中應(yīng)該處理的,所以也應(yīng)該放到領(lǐng)域模型層
ProductService因?yàn)橐蕾嚵藬?shù)據(jù)訪問層,所以也會(huì)依賴在web.config 中配置的數(shù)據(jù)庫連接字符串等信息。這使得,整個(gè)業(yè)務(wù)邏輯層也需要依賴這些配置才能正常運(yùn)行。
在View中,包含了太多了函數(shù)性功能。他執(zhí)行了強(qiáng)制類型轉(zhuǎn)換,字符串格式化等操作,這些功能應(yīng)該是在界面顯示得模型中完成。
上面可能是我們大多數(shù)寫代碼時(shí)候的實(shí)現(xiàn), UI界面層去依賴了數(shù)據(jù)訪問層,有時(shí)候偷懶就直接引用了這一層,因?yàn)閷?shí)體定義在里面了。業(yè)務(wù)邏輯層也是依賴數(shù)據(jù)訪問層,直接在業(yè)務(wù)邏輯里面使用了數(shù)據(jù)訪問層里面的實(shí)體。這樣使得整個(gè)系統(tǒng)緊耦合,并且可測(cè)試性差。那現(xiàn)在我們看看,如何修改這樣一個(gè)系統(tǒng),使之達(dá)到松散耦合,從而提高可測(cè)試性呢?


2 較好的實(shí)現(xiàn)
依賴注入能夠較好的解決上面出現(xiàn)的問題,現(xiàn)在可以使用這一思想來重新實(shí)現(xiàn)前面的系統(tǒng)。之所以重新實(shí)現(xiàn)是因?yàn)?#xff0c;前面的實(shí)現(xiàn)在一開始的似乎就沒有考慮到擴(kuò)展性和松耦合,使用重構(gòu)的方式很難達(dá)到理想的效果。對(duì)于小的系統(tǒng)來說可能還可以,但是對(duì)于一個(gè)大型的系統(tǒng),應(yīng)該是比較困難的。


在寫代碼的時(shí)候,要管理好依賴性,在前面的實(shí)現(xiàn)這種,代碼直接控制了依賴性:當(dāng)ProductService需要一個(gè)ObjectContext類的似乎,直接new了一個(gè),當(dāng)HomeController需要一個(gè)ProductService的時(shí)候,直接new了一個(gè),這樣看起來很酷很方便,實(shí)際上使得整個(gè)系統(tǒng)具有很大的局限性,變得緊耦合。new 操作實(shí)際上就引入了依賴, 控制反轉(zhuǎn)這種思想就是要使的我們比較好的管理依賴。


2.1 松耦合的代碼
2.1.1 表現(xiàn)層


首先從表現(xiàn)層來分析,表現(xiàn)層主要是用來對(duì)數(shù)據(jù)進(jìn)行展現(xiàn),不應(yīng)該包含過多的邏輯。在Index的View頁面中,代碼希望可以寫成這樣


<h2>
? ? Featured Products</h2>
<div>
? ? <% foreach (var product in this.Model.Products)
? ? ? ? { %>
? ? <div>
? ? ? ? <%= this.Html.Encode(product.SummaryText) %></div>
? ? <% } %>
</div>
可以看出,跟之前的表現(xiàn)層代碼相比,要整潔很多。很明顯是不需要進(jìn)行類型轉(zhuǎn)換,要實(shí)現(xiàn)這樣的目的,只需要讓Index.aspx這個(gè)視圖繼承自 System.Web.Mvc.ViewPage<FeaturedProductsViewModel> 即可,當(dāng)我們?cè)趶腃ontroller創(chuàng)建View的時(shí)候,可以進(jìn)行選擇,然后會(huì)自動(dòng)生成。整個(gè)用于展示的信息放在了SummaryText字段中。


這里就引入了一個(gè)視圖模型(View-Specific Models),他封裝了視圖的行為,這些模型只是簡(jiǎn)單的POCOs對(duì)象(Plain Old CLR Objects)。FeatureProductsViewModel中包含了一個(gè)List列表,每個(gè)元素是一個(gè)ProductViewModel類,其中定義了一些簡(jiǎn)單的用于數(shù)據(jù)展示的字段。


FeatureProductsViewModel


現(xiàn)在在Controller中,我們只需要給View返回FeatureProductsViewModel對(duì)象即可。比如:


public ViewResult Index()
{
? ? var vm = new FeaturedProductsViewModel();
? ? return View(vm);
}
現(xiàn)在返回的是空列表,具體的填充方式在領(lǐng)域模型中,我們接著看領(lǐng)域模型層。


2.1.2 領(lǐng)域邏輯層


新建一個(gè)類庫,這里面包含POCOs和一些抽象類型。POCOs用來對(duì)領(lǐng)域建模,抽象類型提供抽象作為到達(dá)領(lǐng)域模型的入口。依賴注入的原則是面向接口而不是具體的類編程,使得我們可以替換具體實(shí)現(xiàn)。


現(xiàn)在我們需要為表現(xiàn)層提供數(shù)據(jù)。因此用戶界面層需要引用領(lǐng)域模型層。對(duì)數(shù)據(jù)訪問層的簡(jiǎn)單抽象可以采用Patterns of Enterprise Application Architecture一書中講到的Repository模式。因此定義一個(gè)ProductRepository抽象類,注意是抽象類,在領(lǐng)域模型庫中。它定義了一個(gè)獲取所有特價(jià)商品的抽象方法:


public abstract class ProductRepository
{
? ? public abstract IEnumerable<Product> GetFeaturedProducts();
}
這個(gè)方法的Product類中只定義了商品的基本信息比如名稱和單價(jià)。整個(gè)關(guān)系圖如下:


Domain model?


現(xiàn)在來看表現(xiàn)層,HomeController中的Index方法應(yīng)該要使用ProductService實(shí)例類來獲取商品列表,執(zhí)行價(jià)格打折,并且把Product類似轉(zhuǎn)化為ProductViewModel實(shí)例,并將該實(shí)例加入到FeaturesProductsViewModel中。因?yàn)镻roductService有一個(gè)帶有類型為ProductReposity抽象類的構(gòu)造函數(shù),所以這里可以通過構(gòu)造函數(shù)注入實(shí)現(xiàn)了ProductReposity抽象類的實(shí)例。這里和之前的最大區(qū)別是,我們沒有使用new關(guān)鍵字來立即new一個(gè)對(duì)象,而是通過構(gòu)造函數(shù)的方式傳入具體的實(shí)現(xiàn)。


現(xiàn)在來看表現(xiàn)層代碼:


public partial class HomeController : Controller
{
? ? private readonly ProductRepository repository;


? ? public HomeController(ProductRepository repository)
? ? {
? ? ? ? if (repository == null)
? ? ? ? {
? ? ? ? ? ? throw new ArgumentNullException("repository");
? ? ? ? }


? ? ? ? this.repository = repository;
? ? }


? ? public ViewResult Index()
? ? {
? ? ? ? var productService = new ProductService(this.repository);


? ? ? ? var vm = new FeaturedProductsViewModel();


? ? ? ? var products = productService.GetFeaturedProducts(this.User);
? ? ? ? foreach (var product in products)
? ? ? ? {
? ? ? ? ? ? var productVM = new ProductViewModel(product);
? ? ? ? ? ? vm.Products.Add(productVM);
? ? ? ? }


? ? ? ? return View(vm);
? ? }


}
在HomeController的構(gòu)造函數(shù)中,傳入了實(shí)現(xiàn)了ProductRepository抽象類的一個(gè)實(shí)例,然后將該實(shí)例保存在定義的私有的只讀的ProductRepository類型的repository對(duì)象中,這就是典型的通過構(gòu)造函數(shù)注入。在Index方法中,獲取數(shù)據(jù)的ProductService類中的主要功能,實(shí)際上是通過傳入的repository類來代理完成的。


ProductService類是一個(gè)純粹的領(lǐng)域?qū)ο?#xff0c;實(shí)現(xiàn)如下:


public class ProductService
{
? ? private readonly ProductRepository repository;


? ? public ProductService(ProductRepository repository)
? ? {
? ? ? ? if (repository == null)
? ? ? ? {
? ? ? ? ? ? throw new ArgumentNullException("repository");
? ? ? ? }


? ? ? ? this.repository = repository;
? ? }


? ? public IEnumerable<DiscountedProduct> GetFeaturedProducts(IPrincipal user)
? ? {
? ? ? ? if (user == null)
? ? ? ? {
? ? ? ? ? ? throw new ArgumentNullException("user");
? ? ? ? }


? ? ? ? return from p in
? ? ? ? ? ? ? ? ? ? ? ? this.repository.GetFeaturedProducts()
? ? ? ? ? ? ? ? select p.ApplyDiscountFor(user);
? ? }
}
可以看到ProductService也是通過構(gòu)造函數(shù)注入的方式,保存了實(shí)現(xiàn)了ProductReposity抽象類的實(shí)例,然后借助該實(shí)例中的GetFeatureProducts方法,獲取原始列表數(shù)據(jù),然后進(jìn)行打折處理,進(jìn)而實(shí)現(xiàn)了自己的GetFeaturedProducts方法。在該GetFeaturedProducts方法中,跟之前不同的地方在于,現(xiàn)在的參數(shù)是IPrincipal,而不是之前的bool型,因?yàn)榕袛嘤脩舻臓顩r,這是一個(gè)業(yè)務(wù)邏輯,不應(yīng)該在表現(xiàn)層處理。IPrincipal是BCL中的類型,所以不存在額外的依賴。我們應(yīng)該基于接口編程IPrincipal是應(yīng)用程序用戶的一種標(biāo)準(zhǔn)方式。


這里將IPrincipal作為參數(shù)傳遞給某個(gè)方法,然后再里面調(diào)用實(shí)現(xiàn)的方式是依賴注入中的方法注入的手段。和構(gòu)造函數(shù)注入一樣,同樣是將內(nèi)部實(shí)現(xiàn)代理給了傳入的依賴對(duì)象。


現(xiàn)在我們只剩下兩塊地方?jīng)]有處理了:


沒有ProductRepository的具體實(shí)現(xiàn),這個(gè)很容易實(shí)現(xiàn),后面放到數(shù)據(jù)訪問層里面去處理,我們只需要?jiǎng)?chuàng)建一個(gè)具體的實(shí)現(xiàn)了ProductRepository的數(shù)據(jù)訪問類即可。
默認(rèn)上,ASP.NET MVC 希望Controller對(duì)象有自己的默認(rèn)構(gòu)造函數(shù),因?yàn)槲覀冊(cè)贖omeController中添加了新的構(gòu)造函數(shù)來注入依賴,所以MVC框架不知道如何解決創(chuàng)建實(shí)例,因?yàn)橛幸蕾?。這個(gè)問題可以通過開發(fā)一個(gè)IControllerFactory來解決,該對(duì)象可以創(chuàng)建一個(gè)具體的ProductRepositry實(shí)例,然后傳給HomeController這里不多講。
現(xiàn)在我們的領(lǐng)域邏輯層已經(jīng)寫好了。在該層,我們只操作領(lǐng)域模型對(duì)象,以及.NET BCL 中的基本對(duì)象。模型使用POCOs來表示,命名為Product。領(lǐng)域模型層必須能夠和外界進(jìn)行交流(database),所以需要一個(gè)抽象類(Repository)來時(shí)完成這一功能,并且在必要的時(shí)候,可以替換具體實(shí)現(xiàn)。


2.1.3 數(shù)據(jù)訪問層


現(xiàn)在我們可以使用LINQ to Entity來實(shí)現(xiàn)具體的數(shù)據(jù)訪問層邏輯了。因?yàn)橐獙?shí)現(xiàn)領(lǐng)域模型的ProductRepository抽象類,所以需要引入領(lǐng)域模型層。注意,這里的依賴變成了數(shù)據(jù)訪問層依賴領(lǐng)域模型層。跟之前的恰好相反,代碼實(shí)現(xiàn)如下:


public class SqlProductRepository : Domain.ProductRepository
{
? ? private readonly CommerceObjectContext context;


? ? public SqlProductRepository(string connString)
? ? {
? ? ? ? this.context =
? ? ? ? ? ? new CommerceObjectContext(connString);
? ? }


? ? public override IEnumerable<Domain.Product> GetFeaturedProducts()
? ? {
? ? ? ? var products = (from p in this.context.Products
? ? ? ? ? ? ? ? ? ? ? ? where p.IsFeatured
? ? ? ? ? ? ? ? ? ? ? ? select p).AsEnumerable();
? ? ? ? return from p in products
? ? ? ? ? ? ? ? select p.ToDomainProduct();
? ? }
}
在這里需要注意的是,在領(lǐng)域模型層中,我們定義了一個(gè)名為Product的領(lǐng)域模型,然后再數(shù)據(jù)訪問層中Entity Framework幫我們也生成了一個(gè)名為Product的數(shù)據(jù)訪問層實(shí)體,他是和db中的Product表一一對(duì)應(yīng)的。所以我們?cè)诜椒ǚ祷氐臅r(shí)候,需要把類型從db中的Product轉(zhuǎn)換為領(lǐng)域模型中的POCOs Product對(duì)象。


two product class in the system?


Domain Model中的Product是一個(gè)POCOs類型的對(duì)象,他僅僅包含領(lǐng)域模型中需要用到的一些基本字段,DataAccess中的Product對(duì)象是映射到DB中的實(shí)體,它包含數(shù)據(jù)庫中Product表定義的所有字段,在數(shù)據(jù)表現(xiàn)層中我們 定義了一個(gè)ProductViewModel數(shù)據(jù)展現(xiàn)的Model。


這兩個(gè)對(duì)象之間的轉(zhuǎn)換很簡(jiǎn)單:


public class Product
{
? ? public Domain.Product ToDomainProduct()
? ? {
? ? ? ? Domain.Product p = new Domain.Product();
? ? ? ? p.Name = this.Name;
? ? ? ? p.UnitPrice = this.UnitPrice;
? ? ? ? return p;
? ? }
}
2.2 分析
2.2.1 依賴關(guān)系圖


現(xiàn)在,整個(gè)系統(tǒng)的依賴關(guān)系圖如下:


Dependency graph in DDD


表現(xiàn)層和數(shù)據(jù)訪問層都依賴領(lǐng)域模型層,這樣,在前面的case中,如果我們新添加一個(gè)UI界面;更換一種數(shù)據(jù)源的存儲(chǔ)和獲取方式,只需要修改對(duì)應(yīng)層的代碼即可,領(lǐng)域模型層保持了穩(wěn)定。


2.2.2 時(shí)序圖


整個(gè)系統(tǒng)的時(shí)序圖如下:


Sequence Diagram?


系統(tǒng)啟動(dòng)的時(shí)候,在Global.asax中創(chuàng)建了一個(gè)自定義了Controller工廠類,應(yīng)用程序?qū)⑵浔4嬖诒镜乇銉煞N,當(dāng)頁面請(qǐng)求進(jìn)來的時(shí)候,程序出發(fā)該工廠類的CreateController方法,并查找web.config中的數(shù)據(jù)庫連接字符串,將其傳遞給新的SqlProductRepository實(shí)例,然后將SqlProductRepository實(shí)例注入到HomeControll中,并返回。


然后應(yīng)用調(diào)用HomeController的實(shí)例方法Index來創(chuàng)建新的ProductService類,并通過構(gòu)造函數(shù)傳入SqlProductRepository。ProductService的GetFeaturedProducts 方法代理給SqlProductRepository實(shí)例去實(shí)現(xiàn)。


最后,返回填充好了FeaturedProductViewModel的ViewResult對(duì)象給頁面,然后MVC進(jìn)行合適的展現(xiàn)。


2.2.3 新的結(jié)構(gòu)


在1.1的實(shí)現(xiàn)中,采用了三層架構(gòu),在改進(jìn)后的實(shí)現(xiàn)中,在UI層和領(lǐng)域模型層中加入了一個(gè)表現(xiàn)模型(presentation model)層。如下圖:


presentation model layer


?


將Controllers和ViewModel從表現(xiàn)層移到了表現(xiàn)模型層,僅僅將視圖(.aspx和.ascx文件)和聚合根對(duì)象(Composition Root)保留在了表現(xiàn)層中。之所以這樣處理,是可以使得盡可能的使得表現(xiàn)層能夠可配置而其他部分盡可能的可以保持不變。


3. 結(jié)語
一不小心我們就編寫出了緊耦合的代碼,有時(shí)候以為分層了就可以解決這一問題,但是大多數(shù)的時(shí)候,都沒有正確的實(shí)現(xiàn)分層。之所以容易寫出緊耦合的代碼有一個(gè)原因是因?yàn)榫幊陶Z言或者開發(fā)環(huán)境允許我們只要需要一個(gè)新的實(shí)例對(duì)象,就可以使用new關(guān)鍵字來實(shí)例化一個(gè)。如果我們需要添加依賴,Visual Studio有些時(shí)候可以自動(dòng)幫我們添加引用。這使得我們很容易就犯錯(cuò),使用new關(guān)鍵字,就可能會(huì)引入以來;添加引用就會(huì)產(chǎn)生依賴。


減少new引入的依賴及緊耦合最好的方式是使用構(gòu)造函數(shù)注入依賴這種設(shè)計(jì)模式:即如果我們需要一個(gè)依賴的實(shí)例,通過構(gòu)造函數(shù)注入。在第二個(gè)部分的實(shí)現(xiàn)演示了如何針對(duì)抽象而不是具體編程。


構(gòu)造函數(shù)注入是反轉(zhuǎn)控制的一個(gè)例子,因?yàn)槲覀兎崔D(zhuǎn)了對(duì)依賴的控制。不是使用new關(guān)鍵字創(chuàng)建一個(gè)實(shí)例,而是將這種行為委托給了第三方實(shí)現(xiàn)。


希望本文能夠給大家了解如何真正實(shí)現(xiàn)三層架構(gòu),編寫松散耦合,可維護(hù),可測(cè)試性的代碼提供一些幫助。
========

理解依賴注入(IOC)和學(xué)習(xí)Unity

http://www.cnblogs.com/zhangchenliang/archive/2013/01/08/2850970.html
IOC:英文全稱:Inversion of Control,中文名稱:控制反轉(zhuǎn),它還有個(gè)名字叫依賴注入(Dependency Injection)。
作用:將各層的對(duì)象以松耦合的方式組織在一起,解耦,各層對(duì)象的調(diào)用完全面向接口。當(dāng)系統(tǒng)重構(gòu)的時(shí)候,代碼的改寫量將大大減少。
理解依賴注入:
? ? 當(dāng)一個(gè)類的實(shí)例需要另一個(gè)類的實(shí)例協(xié)助時(shí),在傳統(tǒng)的程序設(shè)計(jì)過程中,通常有調(diào)用者來創(chuàng)建被調(diào)用者的實(shí)例。然而采用依賴注入的方式,創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成,因此叫控制反轉(zhuǎn),創(chuàng)建被調(diào)用者的實(shí)例的工作由IOC容器來完成,然后注入調(diào)用者,因此也稱為依賴注入。
舉個(gè)有意思的例子(來源于互聯(lián)網(wǎng))


假如我們要設(shè)計(jì)一個(gè)Girl和一個(gè)Boy類,其中Girl有Kiss方法,即Girl想要Kiss一個(gè)Boy,首先問題是Girl如何認(rèn)識(shí)Boy?
? ? 在我們中國常見的MM認(rèn)識(shí)GG的方式有以下幾種:
? ? A 青梅竹馬 ? ?B 親友介紹 ? C 父母包辦
? ? 哪一種是最好的?
1.青梅竹馬:很久很久以前,有個(gè)有錢的地主家的一閨女叫Lily,她老爸把她許配給縣太爺?shù)膬鹤覬immy,屬于指腹為婚,Lily非常喜歡kiss,但是只能kiss Jimmy


public class Lily{ ?
? ? ? ? public Jimmy jimmy; ??
? ? ? ? public Girl() ?
? ? ? ? { ?
? ? ? ? ? ? jimmy=new Jimmy(); ?
? ? ? ? } ?
? ? ? ? public void Kiss() ?
? ? ? ? { ?
? ? ? ? ? ? jimmy.Kiss(); ?
? ? ? ? } ?
? ? } ?
??
? ? public class Jimmy ?
? ? { ?
? ? ? ? public void Kiss() ?
? ? ? ? { ?
? ? ? ? ? ? Console.WriteLine("kissing"); ?
? ? ? ? } ?
? ? } ?
這樣導(dǎo)致Lily對(duì)Jimmy的依賴性非常強(qiáng),緊耦合。


2.親友介紹:經(jīng)常Kiss同一個(gè)人令Lily有些厭惡了,她想嘗試新人,于是與Jimmy分手了,通過親朋好友(中間人)來介紹


public class Lily{ ?
? ? ? ? public Boy boy; ??
??
? ? ? ? public Girl() ?
? ? ? ? { ?
? ? ? ? ? ? boy=BoyFactory.createBoy(); ?
? ? ? ? } ?
? ? ? ? public void Kiss() ?
? ? ? ? { ?
? ? ? ? ? ? boy.Kiss(); ?
? ? ? ? } ?
? ? } ?


親友介紹,固然是好。如果不滿意,盡管另外換一個(gè)好了。但是,親友BoyFactory經(jīng)常是以Singleton的形式出現(xiàn),不然就是,存在于Globals,無處不在,無處不能。實(shí)在是太繁瑣了一點(diǎn),不夠靈活。我為什么一定要這個(gè)親友摻和進(jìn)來呢?為什么一定要付給她介紹費(fèi)呢?萬一最好的朋友愛上了我的男朋友呢?


?


3.父母包辦:一切交給父母,自己不用非吹灰之力,Lily在家只Kiss


public class Lily{ ?
? ? ? ? public Boy boy; ??
? ? ? ? public Girl(Boy boy) ?
? ? ? ? { ?
? ? ? ? ? ? this.boy=boy; ?
? ? ? ? } ?
? ? ? ? public void Kiss() ?
? ? ? ? { ?
? ? ? ? ? ? this.boy.Kiss(); ?
? ? ? ? } ?
? ? } ?
?


?


Well,這是對(duì)Girl最好的方法,只要想辦法賄賂了Girl的父母,并把Boy交給他。那么我們就可以輕松的和Girl來Kiss了??磥韼浊陚鹘y(tǒng)的父母之命還真是有用哦。至少Boy和Girl不用自己瞎忙乎了。這就是IOC,將對(duì)象的創(chuàng)建和獲取提取到外部。由外部容器提供需要的組件。


在設(shè)計(jì)模式中我們應(yīng)該還知道依賴倒轉(zhuǎn)原則,應(yīng)是面向接口編程而不是面向功能實(shí)現(xiàn),好處是:多實(shí)現(xiàn)可以任意切換,我們的Boy應(yīng)該是實(shí)現(xiàn)Kissable接口。這樣一旦Girl不想kiss可惡的Boy的話,還可以kiss可愛的kitten和慈祥的grandmother


好在.net中微軟有一個(gè)輕量級(jí)的IoC框架Unity,支持構(gòu)造器注入,屬性注入,方法注入如下圖所示






具體使用方法如下圖所示


using System; ?
??
using Microsoft.Practices.Unity; ?
??
??
namespace ConsoleApplication9 ?
{ ?
? ? class Program ?
? ? { ?
? ? ? ? static void Main(string[] args) ?
? ? ? ? { ?
? ? ? ? ? ? //創(chuàng)建容器 ?
? ? ? ? ? ? IUnityContainer container=new UnityContainer(); ?
? ? ? ? ? ? //注冊(cè)映射 ?
? ? ? ? ? ? container.RegisterType<IKiss, Boy>(); ?
? ? ? ? ? ? //得到Boy的實(shí)例 ?
? ? ? ? ? ? var boy = container.Resolve<IKiss>(); ?
? ? ? ? ? ? ?
? ? ? ? ? ? Lily lily = new Lily(boy); ?
? ? ? ? ? ? lily.kiss(); ?
? ? ? ? } ?
? ? } ?
??
??
? ? public interface IKiss ?
? ? { ?
? ? ? ? void kiss(); ?
? ? } ?
? ? ??
??
? ? public class Lily:IKiss ?
? ? { ?
??
? ? ? ? public IKiss boy; ??
??
? ? ? ? public Lily(IKiss boy) ?
? ? ? ? { ?
? ? ? ? ? ? this.boy=boy; ?
? ? ? ? } ?
? ? ? ? public void kiss() ?
? ? ? ? { ?
? ? ? ? ? ? boy.kiss(); ?
? ? ? ? ? ? Console.WriteLine("lily kissing"); ?
? ? ? ? } ?
? ? } ?
??
? ? public class Boy : IKiss ?
? ? { ?
? ? ? ? public void kiss() ?
? ? ? ? { ?
? ? ? ? ? ? Console.WriteLine("boy kissing"); ?
? ? ? ? } ?
? ? } ?
} ?
如果采用配置文件注冊(cè)的話


<?xml version="1.0" encoding="utf-8" ?> ?
<configuration> ?
? <configSections> ?
? ? <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/> ?
? </configSections> ?
? <unity> ?
? ? <containers> ?
? ? ? <container name="defaultContainer"> ?
? ? ? ? <register type="命名空間.接口類型1,命名空間" mapTo="命名空間.實(shí)現(xiàn)類型1,命名空間" /> ?
? ? ? ? <register type="命名空間.接口類型2,命名空間" mapTo="命名空間.實(shí)現(xiàn)類型2,命名空間" /> ?
? ? ? </container> ?
? ? </containers> ?
? </unity> ?
</configuration> ?


配置的后臺(tái)代碼:


UnityConfigurationSection configuration = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) ?
? ? ? ? ? ? as UnityConfigurationSection; ?
configuration.Configure(container, "defaultContainer"); ?
可以通過方法ResolveAll來得到所有注冊(cè)對(duì)象的實(shí)例:
var Instances = container.Resolve<IKiss>();


Martin Fowler在那篇著名的文章《Inversion of Control Containers and the Dependency Injection pattern》中將具體依賴注入劃分為三種形式,即構(gòu)造器注入、屬性(設(shè)置)注入和接口注入,習(xí)慣將其劃分為一種(類型)匹配和三種注入:


類型匹配(Type Matching):雖然我們通過接口(或者抽象類)來進(jìn)行服務(wù)調(diào)用,但是服務(wù)本身還是實(shí)現(xiàn)在某個(gè)具體的服務(wù)類型中,這就需要某個(gè)類型注冊(cè)機(jī)制來解決服務(wù)接口和服務(wù)類型之間的匹配關(guān)系;
構(gòu)造器注入(Constructor Injection):IoC容器會(huì)智能地選擇選擇和調(diào)用適合的構(gòu)造函數(shù)以創(chuàng)建依賴的對(duì)象。如果被選擇的構(gòu)造函數(shù)具有相應(yīng)的參數(shù),IoC容器在調(diào)用構(gòu)造函數(shù)之前解析注冊(cè)的依賴關(guān)系并自行獲得相應(yīng)參數(shù)對(duì)象;
屬性注入(Property Injection):如果需要使用到被依賴對(duì)象的某個(gè)屬性,在被依賴對(duì)象被創(chuàng)建之后,IoC容器會(huì)自動(dòng)初始化該屬性;
方法注入(Method Injection):如果被依賴對(duì)象需要調(diào)用某個(gè)方法進(jìn)行相應(yīng)的初始化,在該對(duì)象創(chuàng)建之后,IoC容器會(huì)自動(dòng)調(diào)用該方法。
?


?


我們創(chuàng)建一個(gè)控制臺(tái)程序,定義如下幾個(gè)接口(IA、IB、IC和ID)和它們各自的實(shí)現(xiàn)類(A、B、C、D)。在類型A中定義了3個(gè)屬性B、C和D,其類型分別為接口IB、IC和ID。其中屬性B在構(gòu)在函數(shù)中被初始化,以為著它會(huì)以構(gòu)造器注入的方式被初始化;屬性C上應(yīng)用了DependencyAttribute特性,意味著這是一個(gè)需要以屬性注入方式被初始化的依賴屬性;屬性D則通過方法Initialize初始化,該方法上應(yīng)用了特性InjectionMethodAttribute,意味著這是一個(gè)注入方法在A對(duì)象被IoC容器創(chuàng)建的時(shí)候會(huì)被自動(dòng)調(diào)用。


public interface IA { } ?
? ? public interface IB { } ?
? ? public interface IC { } ?
? ? public interface ID { } ?
??
? ? public class A : IA ?
? ? { ?
? ? ? ? public IB B { get; set; } ?
? ? ? ? [Dependency] ?
? ? ? ? public IC C { get; set; } ?
? ? ? ? public ID D { get; set; } ?
??
? ? ? ? public A(IB b) ?
? ? ? ? { ?
? ? ? ? ? ? this.B = b; ?
? ? ? ? } ?
? ? ? ? [InjectionMethod] ?
? ? ? ? public void Initalize(ID d) ?
? ? ? ? { ?
? ? ? ? ? ? this.D = d; ?
? ? ? ? } ?
? ? } ?
? ? public class B : IB { } ?
? ? public class C : IC { } ?
? ? public class D : ID { } ?


然后我們?yōu)樵搼?yīng)用添加一個(gè)配置文件,并定義如下一段關(guān)于Unity的配置。這段配置定義了一個(gè)名稱為defaultContainer的Unity容器,并在其中完成了上面定義的接口和對(duì)應(yīng)實(shí)現(xiàn)類之間映射的類型匹配。


<?xml version="1.0" encoding="utf-8" ?> ?
<configuration> ?
? <configSections> ?
? ? <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/> ?
? </configSections> ?
? <unity> ?
? ? <containers> ?
? ? ? <container name="defaultContainer"> ?
? ? ? ? <register type="UnityDemo.IA,UnityDemo" mapTo="UnityDemo.A, UnityDemo"/> ?
? ? ? ? <register type="UnityDemo.IB,UnityDemo" mapTo="UnityDemo.B, UnityDemo"/> ?
? ? ? ? <register type="UnityDemo.IC,UnityDemo" mapTo="UnityDemo.C, UnityDemo"/> ?
? ? ? ? <register type="UnityDemo.ID,UnityDemo" mapTo="UnityDemo.D, UnityDemo"/> ?
? ? ? </container> ?
? ? </containers> ?
? </unity> ?
</configuration> ?


最后在Main方法中創(chuàng)建一個(gè)代表IoC容器的UnityContainer對(duì)象,并加載配置信息對(duì)其進(jìn)行初始化。然后調(diào)用它的泛型的Resolve方法創(chuàng)建一個(gè)實(shí)現(xiàn)了泛型接口IA的對(duì)象。最后將返回對(duì)象轉(zhuǎn)變成類型A,并檢驗(yàn)其B、C和D屬性是否是空


class Program ?
? ? { ?
? ? ? ? static void Main(string[] args) ?
? ? ? ? { ?
? ? ? ? ? ? UnityContainer container = new UnityContainer(); ?
? ? ? ? ? ? UnityConfigurationSection configuration = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection; ?
? ? ? ? ? ? configuration.Configure(container, "defaultContainer"); ?
? ? ? ? ? ? A a = container.Resolve<IA>() as A; ?
? ? ? ? ? ? if (null!=a) ?
? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? Console.WriteLine("a.B==null?{0}",a.B==null?"Yes":"No"); ?
? ? ? ? ? ? ? ? Console.WriteLine("a.C==null?{0}", a.C == null ? "Yes" : "No"); ?
? ? ? ? ? ? ? ? Console.WriteLine("a.D==null?{0}", a.D == null ? "Yes" : "No"); ?
? ? ? ? ? ? } ?
? ? ? ? } ?
? ? } ?


從如下給出的執(zhí)行結(jié)果我們可以得到這樣的結(jié)論:通過Resolve<IA>方法返回的是一個(gè)類型為A的對(duì)象,該對(duì)象的三個(gè)屬性被進(jìn)行了有效的初始化。這個(gè)簡(jiǎn)單的程序分別體現(xiàn)了接口注入(通過相應(yīng)的接口根據(jù)配置解析出相應(yīng)的實(shí)現(xiàn)類型)、構(gòu)造器注入(屬性B)、屬性注入(屬性C)和方法注入(屬性D)


? a.B == null ? No
?a.C == null ? No
?a.D == null ? No
========

spring四種依賴注入方式

http://kb.cnblogs.com/page/45266/4/


平常的java開發(fā)中,程序員在某個(gè)類中需要依賴其它類的方法,則通常是new一個(gè)依賴類再調(diào)用類實(shí)例的方法,這種開發(fā)存在的問題是new的類實(shí)例不好統(tǒng)一管理,spring提出了依賴注入的思想,即依賴類不由程序員實(shí)例化,而是通過spring容器幫我們new指定實(shí)例并且將實(shí)例注入到需要該對(duì)象的類中。依賴注入的另一種說法是“控制反轉(zhuǎn)”,通俗的理解是:平常我們new一個(gè)實(shí)例,這個(gè)實(shí)例的控制權(quán)是我們程序員,而控制反轉(zhuǎn)是指new實(shí)例工作不由我們程序員來做而是交給spring容器來做。


spring有多種依賴注入的形式,下面僅介紹spring通過xml進(jìn)行IOC配置的方式:
Set注入
這是最簡(jiǎn)單的注入方式,假設(shè)有一個(gè)SpringAction,類中需要實(shí)例化一個(gè)SpringDao對(duì)象,那么就可以定義一個(gè)private的SpringDao成員變量,然后創(chuàng)建SpringDao的set方法(這是ioc的注入入口):
Java代碼 ?收藏代碼
package com.bless.springdemo.action; ?
public class SpringAction { ?
? ? ? ? //注入對(duì)象springDao ?
? ? private SpringDao springDao; ?
? ? ? ? //一定要寫被注入對(duì)象的set方法 ?
? ? ? ? public void setSpringDao(SpringDao springDao) { ?
? ? ? ? this.springDao = springDao; ?
? ? } ?
??
? ? ? ? public void ok(){ ?
? ? ? ? springDao.ok(); ?
? ? } ?
} ?


隨后編寫spring的xml文件,<bean>中的name屬性是class屬性的一個(gè)別名,class屬性指類的全名,因?yàn)樵赟pringAction中有一個(gè)公共屬性Springdao,所以要在<bean>標(biāo)簽中創(chuàng)建一個(gè)<property>標(biāo)簽指定SpringDao。<property>標(biāo)簽中的name就是SpringAction類中的SpringDao屬性名,ref指下面<bean name="springDao"...>,這樣其實(shí)是spring將SpringDaoImpl對(duì)象實(shí)例化并且調(diào)用SpringAction的setSpringDao方法將SpringDao注入:
Java代碼 ?收藏代碼
<!--配置bean,配置后該類由spring管理--> ?
? ? <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> ?
? ? ? ? <!--(1)依賴注入,配置當(dāng)前類中相應(yīng)的屬性--> ?
? ? ? ? <property name="springDao" ref="springDao"></property> ?
? ? </bean> ?
<bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean> ?
??


構(gòu)造器注入
這種方式的注入是指帶有參數(shù)的構(gòu)造函數(shù)注入,看下面的例子,我創(chuàng)建了兩個(gè)成員變量SpringDao和User,但是并未設(shè)置對(duì)象的set方法,所以就不能支持第一種注入方式,這里的注入方式是在SpringAction的構(gòu)造函數(shù)中注入,也就是說在創(chuàng)建SpringAction對(duì)象時(shí)要將SpringDao和User兩個(gè)參數(shù)值傳進(jìn)來:
Java代碼 ?收藏代碼
public class SpringAction { ?
? ? //注入對(duì)象springDao ?
? ? private SpringDao springDao; ?
? ? private User user; ?
? ? ??
? ? public SpringAction(SpringDao springDao,User user){ ?
? ? ? ? this.springDao = springDao; ?
? ? ? ? this.user = user; ?
? ? ? ? System.out.println("構(gòu)造方法調(diào)用springDao和user"); ?
? ? } ?
? ? ? ? ??
? ? ? ? public void save(){ ?
? ? ? ? user.setName("卡卡"); ?
? ? ? ? springDao.save(user); ?
? ? } ?
} ?
?
在XML文件中同樣不用<property>的形式,而是使用<constructor-arg>標(biāo)簽,ref屬性同樣指向其它<bean>標(biāo)簽的name屬性:
Xml代碼 ?收藏代碼
<!--配置bean,配置后該類由spring管理--> ?
? ? <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> ?
? ? ? ? <!--(2)創(chuàng)建構(gòu)造器注入,如果主類有帶參的構(gòu)造方法則需添加此配置--> ?
? ? ? ? <constructor-arg ref="springDao"></constructor-arg> ?
? ? ? ? <constructor-arg ref="user"></constructor-arg> ?
? ? </bean> ?
? ? ? ? <bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean> ?
? ? ? ? ?<bean name="user" class="com.bless.springdemo.vo.User"></bean> ?
? 解決構(gòu)造方法參數(shù)的不確定性,你可能會(huì)遇到構(gòu)造方法傳入的兩參數(shù)都是同類型的,為了分清哪個(gè)該賦對(duì)應(yīng)值,則需要進(jìn)行一些小處理:
下面是設(shè)置index,就是參數(shù)位置:
Xml代碼 ?收藏代碼
<bean name="springAction" class="com.bless.springdemo.action.SpringAction"> ?
? ? ? ? <constructor-arg index="0" ref="springDao"></constructor-arg> ?
? ? ? ? <constructor-arg index="1" ref="user"></constructor-arg> ?
? ? </bean> ?
? 另一種是設(shè)置參數(shù)類型:
Xml代碼 ?收藏代碼
<constructor-arg type="java.lang.String" ref=""/> ?
?
靜態(tài)工廠的方法注入
靜態(tài)工廠顧名思義,就是通過調(diào)用靜態(tài)工廠的方法來獲取自己需要的對(duì)象,為了讓spring管理所有對(duì)象,我們不能直接通過"工程類.靜態(tài)方法()"來獲取對(duì)象,而是依然通過spring注入的形式獲取:
Java代碼 ?收藏代碼
package com.bless.springdemo.factory; ?
??
import com.bless.springdemo.dao.FactoryDao; ?
import com.bless.springdemo.dao.impl.FactoryDaoImpl; ?
import com.bless.springdemo.dao.impl.StaticFacotryDaoImpl; ?
??
public class DaoFactory { ?
? ? //靜態(tài)工廠 ?
? ? public static final FactoryDao getStaticFactoryDaoImpl(){ ?
? ? ? ? return new StaticFacotryDaoImpl(); ?
? ? } ?
} ?


同樣看關(guān)鍵類,這里我需要注入一個(gè)FactoryDao對(duì)象,這里看起來跟第一種注入一模一樣,但是看隨后的xml會(huì)發(fā)現(xiàn)有很大差別:
Java代碼 ?收藏代碼
?public class SpringAction { ?
? ? ? ? //注入對(duì)象 ?
? ? private FactoryDao staticFactoryDao; ?
? ? ??
? ? public void staticFactoryOk(){ ?
? ? ? ? staticFactoryDao.saveFactory(); ?
? ? } ?
? ? //注入對(duì)象的set方法 ?
? ? public void setStaticFactoryDao(FactoryDao staticFactoryDao) { ?
? ? ? ? this.staticFactoryDao = staticFactoryDao; ?
? ? } ?
} ?
?
Spring的IOC配置文件,注意看<bean name="staticFactoryDao">指向的class并不是FactoryDao的實(shí)現(xiàn)類,而是指向靜態(tài)工廠DaoFactory,并且配置 factory-method="getStaticFactoryDaoImpl"指定調(diào)用哪個(gè)工廠方法:
Xml代碼 ?收藏代碼
<!--配置bean,配置后該類由spring管理--> ?
? ? <bean name="springAction" class="com.bless.springdemo.action.SpringAction" > ?
? ? ? ? <!--(3)使用靜態(tài)工廠的方法注入對(duì)象,對(duì)應(yīng)下面的配置文件(3)--> ?
? ? ? ? <property name="staticFactoryDao" ref="staticFactoryDao"></property> ?
? ? ? ? ? ? ? ? </property> ?
? ? </bean> ?
? ? <!--(3)此處獲取對(duì)象的方式是從工廠類中獲取靜態(tài)方法--> ?
? ? <bean name="staticFactoryDao" class="com.bless.springdemo.factory.DaoFactory" factory-method="getStaticFactoryDaoImpl"></bean> ?
? ? ?
實(shí)例工廠的方法注入
實(shí)例工廠的意思是獲取對(duì)象實(shí)例的方法不是靜態(tài)的,所以你需要首先new工廠類,再調(diào)用普通的實(shí)例方法:
Java代碼 ?收藏代碼
public class DaoFactory { ?
? ? //實(shí)例工廠 ?
? ? public FactoryDao getFactoryDaoImpl(){ ?
? ? ? ? return new FactoryDaoImpl(); ?
? ? } ?
} ?


那么下面這個(gè)類沒什么說的,跟前面也很相似,但是我們需要通過實(shí)例工廠類創(chuàng)建FactoryDao對(duì)象:
Java代碼 ?收藏代碼
public class SpringAction { ?
? ? //注入對(duì)象 ?
? ? private FactoryDao factoryDao; ?
? ? ??
? ? public void factoryOk(){ ?
? ? ? ? factoryDao.saveFactory(); ?
? ? } ?
??
? ? public void setFactoryDao(FactoryDao factoryDao) { ?
? ? ? ? this.factoryDao = factoryDao; ?
? ? } ?
} ?
?
最后看spring配置文件:
Xml代碼 ?收藏代碼
<!--配置bean,配置后該類由spring管理--> ?
? ? <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> ?
? ? ? ? <!--(4)使用實(shí)例工廠的方法注入對(duì)象,對(duì)應(yīng)下面的配置文件(4)--> ?
? ? ? ? <property name="factoryDao" ref="factoryDao"></property> ?
? ? </bean> ?
? ? ??
? ? <!--(4)此處獲取對(duì)象的方式是從工廠類中獲取實(shí)例方法--> ?
? ? <bean name="daoFactory" class="com.bless.springdemo.factory.DaoFactory"></bean> ?
? ? <bean name="factoryDao" factory-bean="daoFactory" factory-method="getFactoryDaoImpl"></bean> ?
?


總結(jié)
Spring IOC注入方式用得最多的是(1)(2)種,多謝多練就會(huì)非常熟練。
? ? ? ? 另外注意:通過Spring創(chuàng)建的對(duì)象默認(rèn)是單例的,如果需要?jiǎng)?chuàng)建多實(shí)例對(duì)象可以在<bean>標(biāo)簽后面添加一個(gè)屬性:
Java代碼 ?收藏代碼
<bean name="..." class="..." scope="prototype">?
========

深度理解依賴注入

http://kb.cnblogs.com/page/45266/4/
摘要:提到依賴注入,大家都會(huì)想到老馬那篇經(jīng)典的文章。其實(shí),本文就是相當(dāng)于對(duì)那篇文章的解讀。所以,如果您對(duì)原文已經(jīng)有了非常深刻的理解,完全不需要再看此文;但是,如果您和筆者一樣,以前曾經(jīng)看過,似乎看懂了,但似乎又沒抓到什么要領(lǐng),不妨看看筆者這個(gè)解讀,也許對(duì)您理解原文有一定幫助。
[1] 依賴在哪里
[2] DI的實(shí)現(xiàn)方式
[3] Setter Injection
[4] 除了DI,還有Service Locator
1.依賴在哪里
? ?老馬舉了一個(gè)小例子,是開發(fā)一個(gè)電影列舉器(MovieList),這個(gè)電影列舉器需要使用一個(gè)電影查找器(MovieFinder)提供的服務(wù),偽碼如下:
?1/*服務(wù)的接口*/
?2public interface MovieFinder {
?3 ? ?ArrayList findAll();
?4}
?5
?6/*服務(wù)的消費(fèi)者*/
?7class MovieLister
?8{
?9 ? ?public Movie[] moviesDirectedBy(String arg) {
10 ? ? ? ?List allMovies = finder.findAll();
11 ? ? ? ?for (Iterator it = allMovies.iterator(); it.hasNext();) {
12 ? ? ? ? ? ?Movie movie = (Movie) it.next();
13 ? ? ? ? ? ?if (!movie.getDirector().equals(arg)) it.remove();
14 ? ? ? ?}
15 ? ? ? ?return (Movie[]) allMovies.toArray(new Movie[allMovies.size()]);
16 ? ?}
17
18 ? ?/*消費(fèi)者內(nèi)部包含一個(gè)將指向具體服務(wù)類型的實(shí)體對(duì)象*/
19 ? ?private MovieFinder finder;
20 ? ?/*消費(fèi)者需要在某一個(gè)時(shí)刻去實(shí)例化具體的服務(wù)。這是我們要解耦的關(guān)鍵所在,
21 ? ? *因?yàn)檫@樣的處理方式造成了服務(wù)消費(fèi)者和服務(wù)提供者的強(qiáng)耦合關(guān)系(這種耦合是在編譯期就確定下來的)。
22 ? ? **/
23 ? ?public MovieLister() {
24 ? ? ? ?finder = new ColonDelimitedMovieFinder("movies1.txt");
25 ? ?}
26}


從上面代碼的注釋中可以看到,MovieLister和ColonDelimitedMovieFinder(這可以使任意一個(gè)實(shí)現(xiàn)了MovieFinder接口的類型)之間存在強(qiáng)耦合關(guān)系,如下圖所示:
圖1
這使得MovieList很難作為一個(gè)成熟的組件去發(fā)布,因?yàn)樵诓煌膽?yīng)用環(huán)境中(包括同一套軟件系統(tǒng)被不同用戶使用的時(shí)候),它所要依賴的電影查找器可能是千差萬別的。所以,為了能實(shí)現(xiàn)真正的基于組件的開發(fā),必須有一種機(jī)制能同時(shí)滿足下面兩個(gè)要求:
?(1)解除MovieList對(duì)具體MoveFinder類型的強(qiáng)依賴(編譯期依賴)。
?(2)在運(yùn)行的時(shí)候?yàn)镸ovieList提供正確的MovieFinder類型的實(shí)例。
? ?換句話說,就是在運(yùn)行的時(shí)候才產(chǎn)生MovieList和MovieFinder之間的依賴關(guān)系(把這種依賴關(guān)系在一個(gè)合適的時(shí)候“注入”運(yùn)行時(shí)),這恐怕就是Dependency Injection這個(gè)術(shù)語的由來。再換句話說,我們提到過解除強(qiáng)依賴,這并不是說MovieList和MovieFinder之間的依賴關(guān)系不存在了,事實(shí)上MovieList無論如何也需要某類MovieFinder提供的服務(wù),我們只是把這種依賴的建立時(shí)間推后了,從編譯器推遲到運(yùn)行時(shí)了。
? ?依賴關(guān)系在OO程序中是廣泛存在的,只要A類型中用到了B類型實(shí)例,A就依賴于B。前面筆者談到的內(nèi)容是把概念抽象到了服務(wù)使用者和服務(wù)提供者的角度,這也符合現(xiàn)在SOA的設(shè)計(jì)思路。從另一種抽象方式上來看,可以把MovieList看成我們要構(gòu)建的主系統(tǒng),而MovieFinder是系統(tǒng)中的plugin,主系統(tǒng)并不強(qiáng)依賴于任何一個(gè)插件,但一旦插件被加載,主系統(tǒng)就應(yīng)該可以準(zhǔn)確調(diào)用適當(dāng)插件的功能。
? ?其實(shí)不管是面向服務(wù)的編程模式,還是基于插件的框架式編程,為了實(shí)現(xiàn)松耦合(服務(wù)調(diào)用者和提供者之間的or框架和插件之間的),都需要在必要的位置實(shí)現(xiàn)面向接口編程,在此基礎(chǔ)之上,還應(yīng)該有一種方便的機(jī)制實(shí)現(xiàn)具體類型之間的運(yùn)行時(shí)綁定,這就是DI所要解決的問題。


2.DI的實(shí)現(xiàn)方式
? ?和上面的圖1對(duì)應(yīng)的是,如果我們的系統(tǒng)實(shí)現(xiàn)了依賴注入,組件間的依賴關(guān)系就變成了圖2:
圖2
說白了,就是要提供一個(gè)容器,由容器來完成(1)具體ServiceProvider的創(chuàng)建(2)ServiceUser和ServiceProvider的運(yùn)行時(shí)綁定。下面我們就依次來看一下三種典型的依賴注入方式的實(shí)現(xiàn)。特別要說明的是,要理解依賴注入的機(jī)制,關(guān)鍵是理解容器的實(shí)現(xiàn)方式。本文后面給出的容器參考實(shí)現(xiàn),均為黃忠成老師的代碼,筆者僅在其中加上了一些關(guān)鍵注釋而已。


2.1 Constructor Injection(構(gòu)造器注入)
?我們可以看到,在整個(gè)依賴注入的數(shù)據(jù)結(jié)構(gòu)中,涉及到的重要的類型就是ServiceUser, ServiceProvider和Assembler三者,而這里所說的構(gòu)造器,指的是ServiceUser的構(gòu)造器。也就是說,在構(gòu)造ServiceUser實(shí)例的時(shí)候,才把真正的ServiceProvider傳給他:
?
1class MovieLister
2{
3 ? //其他內(nèi)容,省略
4
5 ? public MovieLister(MovieFinder finder)
6 ? {
7 ? ? ? this.finder = finder;
8 ? }
9}
接下來我們看看Assembler應(yīng)該如何構(gòu)建:
?1private MutablePicoContainer configureContainer() {
?2 ? ?MutablePicoContainer pico = new DefaultPicoContainer();
?3 ? ?
?4 ? ?//下面就是把ServiceProvider和ServiceUser都放入容器的過程,以后就由容器來提供ServiceUser的已完成依賴注入實(shí)例,
?5 ? ?//其中用到的實(shí)例參數(shù)和類型參數(shù)一般是從配置檔中讀取的,這里是個(gè)簡(jiǎn)單的寫法。
?6 ? ?//所有的依賴注入方法都會(huì)有類似的容器初始化過程,本文在后面的小節(jié)中就不再重復(fù)這一段代碼了。
?7 ? ?Parameter[] finderParams = ?{new ConstantParameter("movies1.txt")};
?8 ? ?pico.registerComponentImplementation(MovieFinder.class, ColonMovieFinder.class, finderParams);
?9 ? ?pico.registerComponentImplementation(MovieLister.class);
10 ? ?//至此,容器里面裝入了兩個(gè)類型,其中沒給出構(gòu)造參數(shù)的那一個(gè)(MovieLister)將依靠其在構(gòu)造器中定義的傳入?yún)?shù)類型,在容器中
11 ? ?//進(jìn)行查找,找到一個(gè)類型匹配項(xiàng)即可進(jìn)行構(gòu)造初始化。
12 ? ?return pico;
13}
需要在強(qiáng)調(diào)一下的是,依賴并未消失,只是延后到了容器被構(gòu)建的時(shí)刻。所以正如圖2中您已經(jīng)看到的,容器本身(更準(zhǔn)確的說,是一個(gè)容器運(yùn)行實(shí)例的構(gòu)建過程)對(duì)ServiceUser和ServiceProvoder都是存在依賴關(guān)系的。所以,在這樣的體系結(jié)構(gòu)里,ServiceUser、ServiceProvider和容器都是穩(wěn)定的,互相之間也沒有任何依賴關(guān)系;所有的依賴關(guān)系、所有的變化都被封裝進(jìn)了容器實(shí)例的創(chuàng)建過程里,符合我們對(duì)服務(wù)應(yīng)用的理解。而且,在實(shí)際開發(fā)中我們一般會(huì)采用配置文件來輔助容器實(shí)例的創(chuàng)建,將這種變化性排斥到編譯期之外。
? ?即使還沒給出后面的代碼,你也一定猜得到,這個(gè)container類一定有一個(gè)GetInstance(Type t)這樣的方法,這個(gè)方法會(huì)為我們返回一個(gè)已經(jīng)注入完畢的MovieLister。 一個(gè)簡(jiǎn)單的應(yīng)用如下:
1public void testWithPico()?
2{
3 ? ?MutablePicoContainer pico = configureContainer();
4 ? ?MovieLister lister = (MovieLister) pico.getComponentInstance(MovieLister.class);
5 ? ?Movie[] movies = lister.moviesDirectedBy("Sergio Leone");
6 ? ?assertEquals("Once Upon a Time in the West", movies[0].getTitle());
7}
上面最關(guān)鍵的就是對(duì)pico.getComponentInstance的調(diào)用。Assembler會(huì)在這個(gè)時(shí)候調(diào)用MovieLister的構(gòu)造器,構(gòu)造器的參數(shù)就是當(dāng)時(shí)通過pico.registerComponentImplementation(MovieFinder.class, ColonMovieFinder.class, finderParams)設(shè)置進(jìn)去的實(shí)際的ServiceProvider--ColonMovieFinder。下面請(qǐng)看這個(gè)容器的參考代碼:


2.2 Setter Injection(設(shè)值注入)
? ?這種注入方式和構(gòu)造注入實(shí)在很類似,唯一的區(qū)別就是前者在構(gòu)造函數(shù)的調(diào)用過程中進(jìn)行注入,而它是通過給屬性賦值來進(jìn)行注入。無怪乎PicoContainer和Spring都是同時(shí)支持這兩種注入方式。Spring對(duì)通過XML進(jìn)行配置有比較好的支持,也使得Spring中更常使用設(shè)值注入的方式:
?1<beans>
?2 ? ?<bean id="MovieLister" class="spring.MovieLister">
?3 ? ? ? ?<property name="finder">
?4 ? ? ? ? ? ?<ref local="MovieFinder"/>
?5 ? ? ? ?property>
?6 ? ?bean>
?7 ? ?<bean id="MovieFinder" class="spring.ColonMovieFinder">
?8 ? ? ? ?<property name="filename">
?9 ? ? ? ? ? ?<value>movies1.txtvalue>
10 ? ? ? ?property>
11 ? ?bean>
12beans>
下面也給出支持設(shè)值注入的容器參考實(shí)現(xiàn),大家可以和構(gòu)造器注入的容器對(duì)照起來看,里面的差別很小,主要的差別就在于,在獲取對(duì)象實(shí)例(GetInstance)的時(shí)候,前者是通過反射得到待創(chuàng)建類型的構(gòu)造器信息,然后根據(jù)構(gòu)造器傳入?yún)?shù)的類型在容器中進(jìn)行查找,并構(gòu)造出合適的實(shí)例;而后者是通過反射得到待創(chuàng)建類型的所有屬性,然后根據(jù)屬性的類型在容器中查找相應(yīng)類型的實(shí)例。
設(shè)值注入的容器實(shí)現(xiàn)偽碼
2.3 Interface Injection (接口注入)
? ?這是筆者認(rèn)為最不夠優(yōu)雅的一種依賴注入方式。要實(shí)現(xiàn)接口注入,首先ServiceProvider要給出一個(gè)接口定義:
1public interface InjectFinder {
2 ? ?void injectFinder(MovieFinder finder);
3}
接下來,ServiceUser必須實(shí)現(xiàn)這個(gè)接口:
1class MovieLister: InjectFinder
2{
3 ? public void injectFinder(MovieFinder finder) {
4 ? ? ?this.finder = finder;
5 ? ?}
6}
容器所要做的,就是根據(jù)接口定義調(diào)用其中的inject方法完成注入過程,這里就不在贅述了,總的原理和上面兩種依賴注入模式?jīng)]有太多區(qū)別。


2.4 ?除了DI,還有Service Locator
? ?上面提到的依賴注入只是消除ServiceUser和ServiceProvider之間的依賴關(guān)系的一種方法,還有另一種方法:服務(wù)定位器(Service Locator)。也就是說,由ServiceLocator來專門負(fù)責(zé)提供具體的ServiceProvider。當(dāng)然,這樣的話ServiceUser不僅要依賴于服務(wù)的接口,還依賴于ServiceContract。仍然是最早提到過的電影列舉器的例子,如果使用Service Locator來解除依賴的話,整個(gè)依賴關(guān)系應(yīng)當(dāng)如下圖所示:
圖3
用起來也很簡(jiǎn)單,在一個(gè)適當(dāng)?shù)奈恢?#xff08;比如在一組相關(guān)服務(wù)即將被調(diào)用之前)對(duì)ServiceLocator進(jìn)行初始化,用到的時(shí)候就直接用ServiceLocator返回ServiceProvider實(shí)例:
?
1//服務(wù)定位器的初始化
2ServiceLocator locator = new ServiceLocator();
3locator.loadService("MovieFinder", new ColonMovieFinder("movies1.txt"));
4ServiceLocator.load(locator);


5//服務(wù)定義器的使用
6//其實(shí)這個(gè)使用方式體現(xiàn)了服務(wù)定位器和依賴注入模式的最大差別:ServiceUser需要顯示的調(diào)用ServiceLocator,從而獲取自己需要的服務(wù)對(duì)象;
7//而依賴注入則是隱式的由容器完成了這一切。
8MovieFinder finder = (MovieFinder) ServiceLocator.getService("MovieFinder");
9
正因?yàn)樯厦嫣岬竭^的ServiceUser對(duì)ServiceLocator的依賴性,從提高模塊的獨(dú)立性(比如說,你可能把你構(gòu)造的ServiceUser或者ServiceProvider給第三方使用)上來說,依賴注入可能更好一些,這恐怕也是為什么大多數(shù)的IOC框架都選用了DI的原因。ServiceLocator最大的優(yōu)點(diǎn)可能在于實(shí)現(xiàn)起來非常簡(jiǎn)單,如果您開發(fā)的應(yīng)用沒有復(fù)雜到需要采用一個(gè)IOC框架的程度,也許您可以試著采用它。
3.廣義的服務(wù)
? ?文中很多地方提到服務(wù)使用者(ServiceUser)和服務(wù)提供者(ServiceProvider)的概念,這里的“服務(wù)”是一種非常廣義的概念,在語法層面就是指最普通的依賴關(guān)系(類型A中有一個(gè)B類型的變量,則A依賴于B)。如果您把服務(wù)理解為WCF或者Web Service中的那種服務(wù)概念,您會(huì)發(fā)現(xiàn)上面所說的所有技術(shù)手段都是沒有意義的。以WCF而論,其客戶端和服務(wù)器端本就是依賴于Contract的松耦合關(guān)系,其實(shí)這也從另一個(gè)角度說明了SOA應(yīng)用的優(yōu)勢(shì)所在。
========

總結(jié)

以上是生活随笔為你收集整理的依赖注入学习总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

亚洲色欲久久久综合网东京热 | 久久久精品人妻久久影视 | 国产猛烈高潮尖叫视频免费 | 人人超人人超碰超国产 | 婷婷丁香五月天综合东京热 | 人人澡人摸人人添 | 国产国语老龄妇女a片 | 77777熟女视频在线观看 а天堂中文在线官网 | 欧美激情综合亚洲一二区 | 国产精品va在线播放 | 欧美丰满熟妇xxxx性ppx人交 | 国产人妻精品一区二区三区不卡 | 鲁一鲁av2019在线 | 一二三四社区在线中文视频 | 精品欧洲av无码一区二区三区 | 天天做天天爱天天爽综合网 | 国产美女精品一区二区三区 | 国产在线精品一区二区高清不卡 | 天天av天天av天天透 | 欧美xxxx黑人又粗又长 | 三上悠亚人妻中文字幕在线 | 红桃av一区二区三区在线无码av | 日日噜噜噜噜夜夜爽亚洲精品 | 无码福利日韩神码福利片 | 国产人妻人伦精品 | 亚洲成a人一区二区三区 | 东京一本一道一二三区 | 日韩精品无码一本二本三本色 | 精品一二三区久久aaa片 | 成年美女黄网站色大免费全看 | 双乳奶水饱满少妇呻吟 | 福利一区二区三区视频在线观看 | 久久99国产综合精品 | 免费乱码人妻系列无码专区 | 中文字幕无码人妻少妇免费 | 高中生自慰www网站 | 中文亚洲成a人片在线观看 | 国产精品第一区揄拍无码 | 久久精品无码一区二区三区 | 色诱久久久久综合网ywww | 九月婷婷人人澡人人添人人爽 | 全球成人中文在线 | 亚洲乱码国产乱码精品精 | 国产成人亚洲综合无码 | 欧美猛少妇色xxxxx | 四虎永久在线精品免费网址 | 亚洲啪av永久无码精品放毛片 | 在线看片无码永久免费视频 | 最近的中文字幕在线看视频 | 国产极品视觉盛宴 | 亚无码乱人伦一区二区 | 久久久久亚洲精品中文字幕 | 无码午夜成人1000部免费视频 | 亚洲の无码国产の无码步美 | 国产精品亚洲а∨无码播放麻豆 | 激情国产av做激情国产爱 | 色噜噜亚洲男人的天堂 | 亚洲经典千人经典日产 | 131美女爱做视频 | 99精品国产综合久久久久五月天 | 一个人看的www免费视频在线观看 | 国产激情一区二区三区 | 天堂久久天堂av色综合 | 任你躁国产自任一区二区三区 | 无码av中文字幕免费放 | 亚洲啪av永久无码精品放毛片 | 欧美丰满熟妇xxxx性ppx人交 | 欧美性生交xxxxx久久久 | 真人与拘做受免费视频一 | 中文字幕乱码人妻二区三区 | 亚洲阿v天堂在线 | 无码国内精品人妻少妇 | 大地资源网第二页免费观看 | 超碰97人人做人人爱少妇 | 国产乱子伦视频在线播放 | 97久久精品无码一区二区 | 国产真实夫妇视频 | 三上悠亚人妻中文字幕在线 | 夜先锋av资源网站 | 奇米影视7777久久精品人人爽 | 啦啦啦www在线观看免费视频 | 无遮无挡爽爽免费视频 | 亚洲中文字幕无码一久久区 | 色综合久久久无码网中文 | 狠狠亚洲超碰狼人久久 | 亚洲国产精品美女久久久久 | 日本肉体xxxx裸交 | 精品少妇爆乳无码av无码专区 | 亚洲欧美色中文字幕在线 | 撕开奶罩揉吮奶头视频 | www一区二区www免费 | 人妻少妇被猛烈进入中文字幕 | 午夜福利试看120秒体验区 | 日日鲁鲁鲁夜夜爽爽狠狠 | 国产色xx群视频射精 | 亚洲精品国偷拍自产在线麻豆 | 久久精品人妻少妇一区二区三区 | 亚洲精品中文字幕乱码 | 日韩 欧美 动漫 国产 制服 | 亚洲爆乳精品无码一区二区三区 | 亚洲成av人片天堂网无码】 | 国产精品亚洲综合色区韩国 | 特大黑人娇小亚洲女 | 亚洲日本va中文字幕 | 国产一区二区不卡老阿姨 | 2020久久超碰国产精品最新 | 在线看片无码永久免费视频 | 国内精品人妻无码久久久影院 | 波多野结衣aⅴ在线 | 领导边摸边吃奶边做爽在线观看 | 欧美亚洲日韩国产人成在线播放 | 亚洲精品久久久久久久久久久 | 精品国产一区二区三区四区 | 亚洲无人区午夜福利码高清完整版 | 午夜福利试看120秒体验区 | 国产精品久久久久久久9999 | 日本免费一区二区三区最新 | 丰满肥臀大屁股熟妇激情视频 | 色婷婷av一区二区三区之红樱桃 | 日日夜夜撸啊撸 | 无人区乱码一区二区三区 | 国产精品手机免费 | 精品成在人线av无码免费看 | 人人妻人人澡人人爽人人精品 | av无码久久久久不卡免费网站 | 最近免费中文字幕中文高清百度 | 99久久久无码国产aaa精品 | 成人精品天堂一区二区三区 | 97人妻精品一区二区三区 | 久久99精品久久久久久 | 中文字幕 人妻熟女 | 成熟女人特级毛片www免费 | 国产成人精品优优av | 天天躁夜夜躁狠狠是什么心态 | 亚洲一区二区三区播放 | 久久人妻内射无码一区三区 | 精品乱子伦一区二区三区 | av小次郎收藏 | 成人无码视频免费播放 | 国产莉萝无码av在线播放 | 国产激情无码一区二区 | www国产亚洲精品久久网站 | 亚洲精品美女久久久久久久 | 狂野欧美性猛xxxx乱大交 | 国产无av码在线观看 | 国产午夜亚洲精品不卡 | 麻豆国产人妻欲求不满谁演的 | 丰满少妇熟乱xxxxx视频 | 无码人妻少妇伦在线电影 | 人妻有码中文字幕在线 | 日本xxxx色视频在线观看免费 | 亚洲色欲色欲欲www在线 | 国产成人精品久久亚洲高清不卡 | 一二三四社区在线中文视频 | 中文字幕av伊人av无码av | 偷窥日本少妇撒尿chinese | 丁香花在线影院观看在线播放 | 国产精品久久久久久亚洲影视内衣 | 国产97人人超碰caoprom | 51国偷自产一区二区三区 | 日日摸夜夜摸狠狠摸婷婷 | 亚洲精品一区二区三区婷婷月 | 天天摸天天透天天添 | 国产成人一区二区三区别 | 久久午夜夜伦鲁鲁片无码免费 | 18禁止看的免费污网站 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲 高清 成人 动漫 | 免费乱码人妻系列无码专区 | 久久 国产 尿 小便 嘘嘘 | 久久精品国产99久久6动漫 | 国产精品毛片一区二区 | 学生妹亚洲一区二区 | 国产超级va在线观看视频 | 亚洲综合无码久久精品综合 | 99精品国产综合久久久久五月天 | 成人女人看片免费视频放人 | 无套内谢的新婚少妇国语播放 | 中文字幕色婷婷在线视频 | √8天堂资源地址中文在线 | 成人免费视频在线观看 | 97色伦图片97综合影院 | 无码帝国www无码专区色综合 | 帮老师解开蕾丝奶罩吸乳网站 | 无码国产乱人伦偷精品视频 | 76少妇精品导航 | 国产在热线精品视频 | 精品人妻人人做人人爽夜夜爽 | 精品久久久无码中文字幕 | 国产精品第一区揄拍无码 | 国产无遮挡又黄又爽免费视频 | 精品国偷自产在线 | 国色天香社区在线视频 | 亚洲精品一区二区三区大桥未久 | 欧美老熟妇乱xxxxx | 色欲人妻aaaaaaa无码 | 亚洲乱码中文字幕在线 | 久久精品人妻少妇一区二区三区 | 亚洲乱码国产乱码精品精 | 色一情一乱一伦一视频免费看 | 一区二区传媒有限公司 | 天堂在线观看www | 亚洲熟悉妇女xxx妇女av | 久久久无码中文字幕久... | 黄网在线观看免费网站 | 美女毛片一区二区三区四区 | 未满小14洗澡无码视频网站 | 奇米影视7777久久精品人人爽 | av在线亚洲欧洲日产一区二区 | 动漫av网站免费观看 | 欧美熟妇另类久久久久久多毛 | 国产av人人夜夜澡人人爽麻豆 | 亚洲乱码中文字幕在线 | 天天躁夜夜躁狠狠是什么心态 | 精品人妻人人做人人爽 | 亚洲综合久久一区二区 | 国产口爆吞精在线视频 | 欧美xxxx黑人又粗又长 | 成人无码精品一区二区三区 | 成人精品视频一区二区三区尤物 | 日日噜噜噜噜夜夜爽亚洲精品 | 性开放的女人aaa片 | 日韩精品a片一区二区三区妖精 | 久久久久免费精品国产 | 国产精品无码成人午夜电影 | 沈阳熟女露脸对白视频 | 欧美人与禽zoz0性伦交 | 国产亚洲精品久久久久久大师 | 亚洲色欲色欲天天天www | 又大又硬又黄的免费视频 | 麻豆精品国产精华精华液好用吗 | 97无码免费人妻超级碰碰夜夜 | 丰满少妇人妻久久久久久 | 国产综合久久久久鬼色 | 免费人成在线视频无码 | 国产精品va在线观看无码 | 国产精品人人爽人人做我的可爱 | 国产精品毛多多水多 | 国产亚洲美女精品久久久2020 | 欧美人与牲动交xxxx | 欧美激情内射喷水高潮 | 图片区 小说区 区 亚洲五月 | 国产精品对白交换视频 | 国产午夜精品一区二区三区嫩草 | 熟妇女人妻丰满少妇中文字幕 | 国产97人人超碰caoprom | 乱人伦人妻中文字幕无码久久网 | 久久国产自偷自偷免费一区调 | 欧美性猛交内射兽交老熟妇 | 窝窝午夜理论片影院 | 亚洲成av人片在线观看无码不卡 | 未满小14洗澡无码视频网站 | 国产麻豆精品一区二区三区v视界 | 久久99精品国产麻豆蜜芽 | 亚洲综合无码久久精品综合 | 强伦人妻一区二区三区视频18 | 波多野结衣av一区二区全免费观看 | 白嫩日本少妇做爰 | 扒开双腿疯狂进出爽爽爽视频 | 曰韩少妇内射免费播放 | 国产精品igao视频网 | 国产精品va在线观看无码 | 桃花色综合影院 | 在线a亚洲视频播放在线观看 | 精品无码成人片一区二区98 | 亚洲国产精品无码一区二区三区 | 精品无码国产自产拍在线观看蜜 | 又粗又大又硬又长又爽 | 亚洲无人区午夜福利码高清完整版 | 国产女主播喷水视频在线观看 | 人人爽人人澡人人人妻 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 久久精品一区二区三区四区 | 天天拍夜夜添久久精品 | 亚洲成a人一区二区三区 | 欧美三级a做爰在线观看 | 国产特级毛片aaaaaaa高清 | 少妇愉情理伦片bd | 日本熟妇乱子伦xxxx | 国产绳艺sm调教室论坛 | 国产在线无码精品电影网 | 国产真人无遮挡作爱免费视频 | 国产又爽又黄又刺激的视频 | 免费人成网站视频在线观看 | 亚洲精品久久久久中文第一幕 | 国产精品免费大片 | 中文字幕人妻无码一区二区三区 | 免费视频欧美无人区码 | 波多野结衣av在线观看 | 天堂亚洲免费视频 | 牲欲强的熟妇农村老妇女视频 | 内射白嫩少妇超碰 | 丝袜美腿亚洲一区二区 | √8天堂资源地址中文在线 | 免费看少妇作爱视频 | 中文字幕亚洲情99在线 | 亚洲综合色区中文字幕 | 黑人巨大精品欧美一区二区 | 中文字幕无线码免费人妻 | 久久久久久久女国产乱让韩 | 久久午夜无码鲁丝片午夜精品 | 久久国产精品二国产精品 | 日本精品高清一区二区 | 水蜜桃亚洲一二三四在线 | 亚洲第一网站男人都懂 | 免费无码av一区二区 | 天堂一区人妻无码 | 国语自产偷拍精品视频偷 | 亚洲成在人网站无码天堂 | 国产精品永久免费视频 | 亚洲国产欧美在线成人 | 玩弄少妇高潮ⅹxxxyw | 亚洲综合色区中文字幕 | 久久精品视频在线看15 | 成人无码精品一区二区三区 | 一个人看的www免费视频在线观看 | 黑人巨大精品欧美黑寡妇 | 最近免费中文字幕中文高清百度 | 国产精品毛片一区二区 | av无码不卡在线观看免费 | 国产香蕉尹人视频在线 | 一个人看的视频www在线 | 亚洲国产精华液网站w | 成人无码精品1区2区3区免费看 | 午夜无码区在线观看 | 国产亚洲精品久久久闺蜜 | 久久精品成人欧美大片 | 国产猛烈高潮尖叫视频免费 | 久久久久成人精品免费播放动漫 | 人人妻人人藻人人爽欧美一区 | 日本精品高清一区二区 | 亚洲成av人综合在线观看 | 中文字幕色婷婷在线视频 | 国产尤物精品视频 | 内射巨臀欧美在线视频 | 玩弄中年熟妇正在播放 | 给我免费的视频在线观看 | 亚洲精品久久久久avwww潮水 | 亚洲阿v天堂在线 | 亚洲日韩av片在线观看 | 中文精品无码中文字幕无码专区 | 久久久久久a亚洲欧洲av冫 | 亚洲精品久久久久久一区二区 | 国产99久久精品一区二区 | 亚洲精品鲁一鲁一区二区三区 | 中文字幕日产无线码一区 | 51国偷自产一区二区三区 | 无码人中文字幕 | 白嫩日本少妇做爰 | 天天爽夜夜爽夜夜爽 | 成年美女黄网站色大免费全看 | 99re在线播放 | 四虎国产精品一区二区 | 久久国产精品偷任你爽任你 | 高清无码午夜福利视频 | 成人精品视频一区二区 | 又色又爽又黄的美女裸体网站 | 亚洲成av人在线观看网址 | av人摸人人人澡人人超碰下载 | 两性色午夜视频免费播放 | 日本一卡二卡不卡视频查询 | 免费乱码人妻系列无码专区 | 性做久久久久久久免费看 | 人人爽人人澡人人高潮 | 一个人看的www免费视频在线观看 | 无码任你躁久久久久久久 | 国产精品欧美成人 | 日韩av无码一区二区三区不卡 | 理论片87福利理论电影 | 免费国产成人高清在线观看网站 | 亚洲精品成人福利网站 | 亚洲成av人影院在线观看 | 亚拍精品一区二区三区探花 | 精品成人av一区二区三区 | √天堂中文官网8在线 | 熟妇女人妻丰满少妇中文字幕 | 激情国产av做激情国产爱 | 色欲av亚洲一区无码少妇 | 老熟女重囗味hdxx69 | 欧美 亚洲 国产 另类 | 牲欲强的熟妇农村老妇女视频 | 欧美黑人性暴力猛交喷水 | av人摸人人人澡人人超碰下载 | 亚洲色欲色欲欲www在线 | 精品国产麻豆免费人成网站 | 99久久久无码国产aaa精品 | 狠狠色噜噜狠狠狠狠7777米奇 | 99久久亚洲精品无码毛片 | 精品国产青草久久久久福利 | 97无码免费人妻超级碰碰夜夜 | 无码成人精品区在线观看 | 欧洲美熟女乱又伦 | 日本一区二区三区免费播放 | 亚洲小说图区综合在线 | 日日夜夜撸啊撸 | 欧美怡红院免费全部视频 | 国产 精品 自在自线 | 伊人久久大香线蕉av一区二区 | 亚洲国产av精品一区二区蜜芽 | 亚洲精品成a人在线观看 | 丰满人妻翻云覆雨呻吟视频 | 东京无码熟妇人妻av在线网址 | 乱人伦人妻中文字幕无码久久网 | 国产av一区二区三区最新精品 | 国产精品怡红院永久免费 | 无码人妻出轨黑人中文字幕 | 欧美性猛交内射兽交老熟妇 | 波多野结衣乳巨码无在线观看 | 久久精品无码一区二区三区 | 亚洲日本一区二区三区在线 | 久久97精品久久久久久久不卡 | 欧美老熟妇乱xxxxx | 无码福利日韩神码福利片 | 欧美日韩一区二区免费视频 | 日本一卡2卡3卡四卡精品网站 | 亚洲第一无码av无码专区 | 丰满少妇女裸体bbw | 日本精品高清一区二区 | 清纯唯美经典一区二区 | 国产国产精品人在线视 | 亚洲男女内射在线播放 | 色一情一乱一伦一视频免费看 | 波多野结衣av在线观看 | 国产成人一区二区三区在线观看 | 爱做久久久久久 | 亚洲人亚洲人成电影网站色 | 国产av无码专区亚洲awww | 大肉大捧一进一出好爽视频 | 午夜熟女插插xx免费视频 | 国产精品久久久久影院嫩草 | 久久国内精品自在自线 | 亚洲熟妇自偷自拍另类 | 亚洲成色在线综合网站 | 性欧美videos高清精品 | 曰韩少妇内射免费播放 | 好男人社区资源 | 午夜精品一区二区三区的区别 | 人人爽人人澡人人人妻 | 国产精品久久久午夜夜伦鲁鲁 | 噜噜噜亚洲色成人网站 | 色窝窝无码一区二区三区色欲 | 久久人人爽人人人人片 | 精品久久8x国产免费观看 | 2019nv天堂香蕉在线观看 | 小sao货水好多真紧h无码视频 | 成熟人妻av无码专区 | 九月婷婷人人澡人人添人人爽 | 国产人妻久久精品二区三区老狼 | 国产午夜福利亚洲第一 | 亚洲天堂2017无码中文 | 亚拍精品一区二区三区探花 | 免费无码一区二区三区蜜桃大 | 色婷婷香蕉在线一区二区 | 少妇厨房愉情理9仑片视频 | 97久久精品无码一区二区 | 国产综合久久久久鬼色 | 精品无码国产一区二区三区av | 熟女少妇在线视频播放 | 亚洲国产高清在线观看视频 | 激情综合激情五月俺也去 | 久久精品中文字幕一区 | 奇米影视7777久久精品 | 成人女人看片免费视频放人 | 成人免费视频在线观看 | 久久久精品欧美一区二区免费 | 成人性做爰aaa片免费看 | 粗大的内捧猛烈进出视频 | 国产av久久久久精东av | 131美女爱做视频 | 国产亚洲精品精品国产亚洲综合 | 亚洲最大成人网站 | 内射后入在线观看一区 | 伊人久久婷婷五月综合97色 | 中文字幕乱码人妻无码久久 | 亚洲成av人片天堂网无码】 | 亚洲人成人无码网www国产 | 亚洲狠狠婷婷综合久久 | 黑森林福利视频导航 | 久久人人97超碰a片精品 | 欧美喷潮久久久xxxxx | 日日摸天天摸爽爽狠狠97 | 亚洲日本va午夜在线电影 | 无码av免费一区二区三区试看 | 国产偷国产偷精品高清尤物 | 老司机亚洲精品影院无码 | 色欲综合久久中文字幕网 | 全黄性性激高免费视频 | 成人性做爰aaa片免费看不忠 | 欧美兽交xxxx×视频 | 国产精品沙发午睡系列 | 欧美 丝袜 自拍 制服 另类 | 精品国产一区二区三区四区在线看 | 久久久久av无码免费网 | 国产成人无码av一区二区 | 国产精品沙发午睡系列 | 欧美激情综合亚洲一二区 | 18无码粉嫩小泬无套在线观看 | 免费无码一区二区三区蜜桃大 | 99国产欧美久久久精品 | 亚洲精品综合一区二区三区在线 | 国产偷自视频区视频 | 国产黄在线观看免费观看不卡 | 动漫av一区二区在线观看 | 中文字幕无线码免费人妻 | 国产精华av午夜在线观看 | 亚洲成av人综合在线观看 | 水蜜桃亚洲一二三四在线 | 国产精品国产三级国产专播 | 欧美xxxxx精品 | 高清不卡一区二区三区 | 少妇一晚三次一区二区三区 | 久久久久成人片免费观看蜜芽 | 成在人线av无码免观看麻豆 | 久久精品女人天堂av免费观看 | 国产精品毛片一区二区 | 国产亚洲精品久久久久久 | 亚洲色欲久久久综合网东京热 | 欧美丰满熟妇xxxx | 色婷婷久久一区二区三区麻豆 | 亚洲色大成网站www | 黑人巨大精品欧美黑寡妇 | 野狼第一精品社区 | 午夜精品久久久久久久 | 国产精品毛多多水多 | 性欧美熟妇videofreesex | 成人性做爰aaa片免费看 | 国产真实乱对白精彩久久 | 国内丰满熟女出轨videos | 国产 精品 自在自线 | 精品久久久无码中文字幕 | 久久综合久久自在自线精品自 | 爱做久久久久久 | 99久久久无码国产aaa精品 | 色偷偷人人澡人人爽人人模 | 国产亚洲日韩欧美另类第八页 | 欧美zoozzooz性欧美 | 日韩亚洲欧美精品综合 | 国内精品人妻无码久久久影院蜜桃 | 日韩人妻无码中文字幕视频 | 人妻有码中文字幕在线 | 图片区 小说区 区 亚洲五月 | 国产舌乚八伦偷品w中 | 99精品无人区乱码1区2区3区 | 男女下面进入的视频免费午夜 | 亚洲成色www久久网站 | 中国女人内谢69xxxxxa片 | 一本无码人妻在中文字幕免费 | 波多野结衣av在线观看 | 天天av天天av天天透 | 久久 国产 尿 小便 嘘嘘 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲s色大片在线观看 | 国产av久久久久精东av | 鲁大师影院在线观看 | 亚洲国产av精品一区二区蜜芽 | 一本一道久久综合久久 | 内射白嫩少妇超碰 | 成人av无码一区二区三区 | 亚洲区小说区激情区图片区 | 国产在线一区二区三区四区五区 | 97久久精品无码一区二区 | 亚洲综合久久一区二区 | 精品夜夜澡人妻无码av蜜桃 | 青春草在线视频免费观看 | 无码国模国产在线观看 | 国产午夜无码视频在线观看 | 婷婷五月综合激情中文字幕 | 性色欲网站人妻丰满中文久久不卡 | 久久精品国产日本波多野结衣 | 在线亚洲高清揄拍自拍一品区 | 国产成人精品视频ⅴa片软件竹菊 | 午夜精品久久久内射近拍高清 | 少妇无码av无码专区在线观看 | 色噜噜亚洲男人的天堂 | 一本大道久久东京热无码av | 日产精品高潮呻吟av久久 | 在线观看免费人成视频 | 欧美性猛交xxxx富婆 | 久久综合九色综合欧美狠狠 | 99国产精品白浆在线观看免费 | 中文字幕av无码一区二区三区电影 | 国内丰满熟女出轨videos | 熟女体下毛毛黑森林 | 国产亚洲欧美在线专区 | 亚洲天堂2017无码 | 久久婷婷五月综合色国产香蕉 | 无人区乱码一区二区三区 | 亚洲国产精品美女久久久久 | 99久久人妻精品免费二区 | 国内综合精品午夜久久资源 | 强开小婷嫩苞又嫩又紧视频 | 久久久久久国产精品无码下载 | 熟妇人妻中文av无码 | 人妻有码中文字幕在线 | 亚洲中文字幕无码一久久区 | 无码人妻少妇伦在线电影 | 青草视频在线播放 | 97久久精品无码一区二区 | 双乳奶水饱满少妇呻吟 | 欧美日韩人成综合在线播放 | 樱花草在线播放免费中文 | 无码福利日韩神码福利片 | 奇米影视888欧美在线观看 | 青青青手机频在线观看 | 麻豆国产人妻欲求不满 | 亚洲人成影院在线无码按摩店 | 未满成年国产在线观看 | 久久精品人妻少妇一区二区三区 | 无码人妻少妇伦在线电影 | 少妇性l交大片欧洲热妇乱xxx | 日韩无套无码精品 | 狠狠亚洲超碰狼人久久 | 国产疯狂伦交大片 | 日韩人妻无码一区二区三区久久99 | 久久国产精品_国产精品 | 欧美日本精品一区二区三区 | 亚洲综合伊人久久大杳蕉 | 国产精品久久久久9999小说 | 欧美野外疯狂做受xxxx高潮 | 欧美freesex黑人又粗又大 | 国产精品亚洲五月天高清 | 国产av剧情md精品麻豆 | 无码中文字幕色专区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 学生妹亚洲一区二区 | 98国产精品综合一区二区三区 | 国产成人精品三级麻豆 | 免费国产黄网站在线观看 | 日本爽爽爽爽爽爽在线观看免 | 性开放的女人aaa片 | 亚洲色成人中文字幕网站 | 狠狠综合久久久久综合网 | 国产成人人人97超碰超爽8 | 蜜臀aⅴ国产精品久久久国产老师 | 国产精品沙发午睡系列 | 久久久久久亚洲精品a片成人 | 亚洲国产欧美日韩精品一区二区三区 | 2019午夜福利不卡片在线 | 欧美丰满少妇xxxx性 | 无码人妻丰满熟妇区五十路百度 | 无套内谢老熟女 | 午夜精品一区二区三区在线观看 | 综合网日日天干夜夜久久 | 99精品视频在线观看免费 | 一本无码人妻在中文字幕免费 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产亚洲精品久久久ai换 | 男人的天堂2018无码 | 国产色视频一区二区三区 | 午夜无码人妻av大片色欲 | 久久久中文久久久无码 | 成熟人妻av无码专区 | 久久久久人妻一区精品色欧美 | 日韩av无码一区二区三区不卡 | 未满小14洗澡无码视频网站 | 全球成人中文在线 | 人妻有码中文字幕在线 | 天天燥日日燥 | 亚洲精品综合五月久久小说 | 日本一区二区更新不卡 | aⅴ在线视频男人的天堂 | 奇米影视7777久久精品人人爽 | 国产成人综合在线女婷五月99播放 | 国内少妇偷人精品视频 | 东京无码熟妇人妻av在线网址 | 四虎国产精品一区二区 | 中文字幕无码av激情不卡 | 性欧美熟妇videofreesex | 55夜色66夜色国产精品视频 | 少妇高潮一区二区三区99 | 又大又硬又爽免费视频 | 亚洲色偷偷男人的天堂 | 天天av天天av天天透 | 国产色精品久久人妻 | 亚洲 欧美 激情 小说 另类 | 美女张开腿让人桶 | 1000部夫妻午夜免费 | 亚洲小说图区综合在线 | 日本熟妇乱子伦xxxx | 任你躁在线精品免费 | 377p欧洲日本亚洲大胆 | 亚洲精品综合五月久久小说 | 99久久久国产精品无码免费 | 性色av无码免费一区二区三区 | 高清国产亚洲精品自在久久 | 少妇高潮一区二区三区99 | 日本熟妇大屁股人妻 | 国产精品人妻一区二区三区四 | 三上悠亚人妻中文字幕在线 | 中文字幕无码av波多野吉衣 | 亚洲国产精品久久久天堂 | 国产亚洲欧美日韩亚洲中文色 | 免费无码的av片在线观看 | 免费无码一区二区三区蜜桃大 | 真人与拘做受免费视频 | 久久精品国产精品国产精品污 | 国产成人综合在线女婷五月99播放 | 97色伦图片97综合影院 | 精品无码一区二区三区的天堂 | 精品日本一区二区三区在线观看 | 久久久久人妻一区精品色欧美 | 大色综合色综合网站 | 无套内射视频囯产 | 国产凸凹视频一区二区 | 午夜免费福利小电影 | 无码国内精品人妻少妇 | 久久国产精品二国产精品 | 日本xxxx色视频在线观看免费 | 久久国产精品偷任你爽任你 | 俺去俺来也www色官网 | 又色又爽又黄的美女裸体网站 | 免费无码的av片在线观看 | 人妻体内射精一区二区三四 | 久久成人a毛片免费观看网站 | 久久久久se色偷偷亚洲精品av | 久久久久se色偷偷亚洲精品av | 成熟人妻av无码专区 | 日本大乳高潮视频在线观看 | 亚洲国产成人av在线观看 | 国内揄拍国内精品少妇国语 | 欧美日本免费一区二区三区 | 国产福利视频一区二区 | 影音先锋中文字幕无码 | 国产成人一区二区三区在线观看 | 人妻无码久久精品人妻 | 日日干夜夜干 | 性做久久久久久久久 | 呦交小u女精品视频 | 日产精品高潮呻吟av久久 | 成在人线av无码免观看麻豆 | 激情国产av做激情国产爱 | 免费观看的无遮挡av | 熟女俱乐部五十路六十路av | 欧美freesex黑人又粗又大 | 在线观看欧美一区二区三区 | 国产真人无遮挡作爱免费视频 | 丁香啪啪综合成人亚洲 | 亚洲日韩av片在线观看 | 日本一区二区更新不卡 | 中文久久乱码一区二区 | 特大黑人娇小亚洲女 | 亚洲精品www久久久 | 少妇无套内谢久久久久 | 国产精品久久久一区二区三区 | 国产黑色丝袜在线播放 | 成在人线av无码免费 | 人人爽人人澡人人人妻 | 久久亚洲国产成人精品性色 | 国产99久久精品一区二区 | 国产精品igao视频网 | 亚洲精品久久久久avwww潮水 | 国语自产偷拍精品视频偷 | 蜜臀av在线播放 久久综合激激的五月天 | 97人妻精品一区二区三区 | 大肉大捧一进一出好爽视频 | 国产农村乱对白刺激视频 | 成人无码精品一区二区三区 | 亚洲色大成网站www | 亚洲精品一区三区三区在线观看 | 成人影院yy111111在线观看 | 丰满岳乱妇在线观看中字无码 | 九九综合va免费看 | 亚洲日韩av一区二区三区中文 | 日韩无套无码精品 | 国产精品久久久久无码av色戒 | 亚洲中文无码av永久不收费 | 人人妻人人藻人人爽欧美一区 | 国产午夜视频在线观看 | 18禁止看的免费污网站 | 自拍偷自拍亚洲精品被多人伦好爽 | 精品国产一区二区三区四区在线看 | 中文字幕无码免费久久99 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产免费无码一区二区视频 | 色综合天天综合狠狠爱 | 精品人妻av区 | 亚洲精品欧美二区三区中文字幕 | 国产精品人人爽人人做我的可爱 | 国产精品无码mv在线观看 | 天天爽夜夜爽夜夜爽 | 偷窥日本少妇撒尿chinese | 日本乱人伦片中文三区 | 77777熟女视频在线观看 а天堂中文在线官网 | 在线播放无码字幕亚洲 | aⅴ亚洲 日韩 色 图网站 播放 | 国精产品一区二区三区 | 国内精品人妻无码久久久影院蜜桃 | 99久久无码一区人妻 | 秋霞成人午夜鲁丝一区二区三区 | 国产精品igao视频网 | 色综合久久久久综合一本到桃花网 | 中文字幕 人妻熟女 | 日本va欧美va欧美va精品 | 图片区 小说区 区 亚洲五月 | 欧美性生交xxxxx久久久 | 在线精品亚洲一区二区 | 特黄特色大片免费播放器图片 | 秋霞成人午夜鲁丝一区二区三区 | 伊人色综合久久天天小片 | 一本久久a久久精品亚洲 | 国精产品一品二品国精品69xx | 国产在线精品一区二区三区直播 | 亚洲自偷自拍另类第1页 | 国产精品久久久久久久9999 | 女人被爽到呻吟gif动态图视看 | 亚洲成a人片在线观看无码3d | 成熟女人特级毛片www免费 | 久在线观看福利视频 | 帮老师解开蕾丝奶罩吸乳网站 | 精品国产青草久久久久福利 | 亚洲中文字幕无码中字 | 99久久久国产精品无码免费 | 亚洲成a人片在线观看无码3d | 亚洲综合无码一区二区三区 | 成人精品视频一区二区三区尤物 | 精品无码av一区二区三区 | 精品一二三区久久aaa片 | 精品无码一区二区三区爱欲 | 狂野欧美性猛xxxx乱大交 | 国产成人亚洲综合无码 | 日韩精品成人一区二区三区 | 国产99久久精品一区二区 | 中文字幕无码热在线视频 | 国产成人亚洲综合无码 | 中国女人内谢69xxxxxa片 | 99riav国产精品视频 | 巨爆乳无码视频在线观看 | 无码人妻久久一区二区三区不卡 | 亚洲一区av无码专区在线观看 | 欧美一区二区三区视频在线观看 | 国产亚洲精品久久久久久大师 | 国产手机在线αⅴ片无码观看 | 中文字幕无码av激情不卡 | 无码一区二区三区在线观看 | 成人精品天堂一区二区三区 | 亚洲 a v无 码免 费 成 人 a v | 久在线观看福利视频 | 131美女爱做视频 | 少妇无套内谢久久久久 | 女人被男人躁得好爽免费视频 | 亲嘴扒胸摸屁股激烈网站 | 国产精品-区区久久久狼 | 亚洲综合久久一区二区 | 亚洲а∨天堂久久精品2021 | 日本精品高清一区二区 | 在线 国产 欧美 亚洲 天堂 | 午夜精品久久久久久久 | 午夜福利一区二区三区在线观看 | 久久婷婷五月综合色国产香蕉 | 国产综合色产在线精品 | 国产av无码专区亚洲awww | 国产精品亚洲一区二区三区喷水 | 中文字幕乱码中文乱码51精品 | 国产色精品久久人妻 | 国产精品香蕉在线观看 | 亚无码乱人伦一区二区 | 国产成人精品三级麻豆 | 免费乱码人妻系列无码专区 | 成人av无码一区二区三区 | 高清国产亚洲精品自在久久 | 色婷婷欧美在线播放内射 | 婷婷丁香五月天综合东京热 | 精品偷拍一区二区三区在线看 | 捆绑白丝粉色jk震动捧喷白浆 | 老头边吃奶边弄进去呻吟 | 日产精品高潮呻吟av久久 | 中文字幕 人妻熟女 | 婷婷色婷婷开心五月四房播播 | 男女作爱免费网站 | 国产suv精品一区二区五 | 国产精品欧美成人 | 波多野42部无码喷潮在线 | 国产精品久久久久影院嫩草 | 精品无码一区二区三区爱欲 | 国产免费无码一区二区视频 | 久久综合色之久久综合 | 成人免费视频视频在线观看 免费 | 欧美人与物videos另类 | 十八禁视频网站在线观看 | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲色欲色欲天天天www | 日本www一道久久久免费榴莲 | 又色又爽又黄的美女裸体网站 | 无码毛片视频一区二区本码 | 国产97人人超碰caoprom | 国产精品久久久久久久9999 | 亚洲精品中文字幕久久久久 | 国产高清不卡无码视频 | 亚洲一区二区三区 | 国产亚洲精品精品国产亚洲综合 | 亚洲经典千人经典日产 | 玩弄少妇高潮ⅹxxxyw | 国产成人无码区免费内射一片色欲 | 麻豆国产97在线 | 欧洲 | 国内精品久久毛片一区二区 | 中文无码精品a∨在线观看不卡 | 蜜桃视频韩日免费播放 | 亚洲色无码一区二区三区 | 大肉大捧一进一出视频出来呀 | 在线 国产 欧美 亚洲 天堂 | 99久久亚洲精品无码毛片 | 欧美freesex黑人又粗又大 | 激情五月综合色婷婷一区二区 | 国产精品久久久一区二区三区 | 人人妻人人澡人人爽精品欧美 | 在线精品亚洲一区二区 | 成人影院yy111111在线观看 | 精品厕所偷拍各类美女tp嘘嘘 | 又大又硬又爽免费视频 | 精品久久久久久亚洲精品 | 成熟人妻av无码专区 | 巨爆乳无码视频在线观看 | 亚洲天堂2017无码中文 | 中文字幕日韩精品一区二区三区 | 国产av一区二区三区最新精品 | av在线亚洲欧洲日产一区二区 | 久精品国产欧美亚洲色aⅴ大片 | 内射后入在线观看一区 | 午夜成人1000部免费视频 | 麻豆国产丝袜白领秘书在线观看 | 国产精品亚洲专区无码不卡 | 巨爆乳无码视频在线观看 | 日本精品人妻无码77777 天堂一区人妻无码 | 国产人妻精品一区二区三区不卡 | 国产av无码专区亚洲awww | 亚洲成av人在线观看网址 | 亚洲a无码综合a国产av中文 | 免费无码一区二区三区蜜桃大 | 少妇人妻av毛片在线看 | 精品无码成人片一区二区98 | 亚洲精品综合五月久久小说 | 国产亚洲精品久久久久久久久动漫 | 成人女人看片免费视频放人 | 国产香蕉尹人视频在线 | 人妻aⅴ无码一区二区三区 | 亚洲国产日韩a在线播放 | 极品尤物被啪到呻吟喷水 | 免费无码午夜福利片69 | 大乳丰满人妻中文字幕日本 | 男女超爽视频免费播放 | 成人无码影片精品久久久 | 国产精品无码一区二区三区不卡 | 亚洲 另类 在线 欧美 制服 | 激情五月综合色婷婷一区二区 | 午夜成人1000部免费视频 | 午夜性刺激在线视频免费 | 久久熟妇人妻午夜寂寞影院 | 欧美成人家庭影院 | 乱中年女人伦av三区 | 中文字幕人妻无码一夲道 | 男人的天堂av网站 | 特黄特色大片免费播放器图片 | 亚洲区欧美区综合区自拍区 | 永久免费精品精品永久-夜色 | 无码人妻出轨黑人中文字幕 | 国产一区二区三区四区五区加勒比 | 麻豆成人精品国产免费 | 欧美人妻一区二区三区 | 欧美激情综合亚洲一二区 | 性生交大片免费看l | 亚洲熟女一区二区三区 | 久久久久久av无码免费看大片 | 欧洲欧美人成视频在线 | 中文字幕乱码亚洲无线三区 | 人妻少妇被猛烈进入中文字幕 | 熟妇人妻无乱码中文字幕 | 四虎4hu永久免费 | 亚洲高清偷拍一区二区三区 | 亚洲欧洲日本无在线码 | 欧美激情综合亚洲一二区 | 清纯唯美经典一区二区 | 日本xxxx色视频在线观看免费 | 免费男性肉肉影院 | 成年女人永久免费看片 | v一区无码内射国产 | 亚洲一区二区三区偷拍女厕 | 大色综合色综合网站 | 国产av人人夜夜澡人人爽麻豆 | 一本大道久久东京热无码av | 亚洲国产成人av在线观看 | 麻豆md0077饥渴少妇 | 欧美刺激性大交 | 麻豆av传媒蜜桃天美传媒 | 无码毛片视频一区二区本码 | 强开小婷嫩苞又嫩又紧视频 | 丰满少妇女裸体bbw | 精品国产麻豆免费人成网站 | 欧美性黑人极品hd | 给我免费的视频在线观看 | 大色综合色综合网站 | 亚洲人成网站在线播放942 | 色婷婷av一区二区三区之红樱桃 | 亚洲成av人片在线观看无码不卡 | 国产超碰人人爽人人做人人添 | 国产偷国产偷精品高清尤物 | ass日本丰满熟妇pics | 麻豆成人精品国产免费 | 国产精品毛多多水多 | 日韩精品无码一本二本三本色 | 色婷婷久久一区二区三区麻豆 | 日韩精品a片一区二区三区妖精 | 国产精品无码一区二区桃花视频 | 牲欲强的熟妇农村老妇女视频 | 色婷婷香蕉在线一区二区 | 青青青手机频在线观看 | 久久精品国产一区二区三区 | 久久亚洲精品中文字幕无男同 | 少妇无套内谢久久久久 | 牛和人交xxxx欧美 | 国产精品久免费的黄网站 | 综合网日日天干夜夜久久 | 国内精品久久久久久中文字幕 | 日本一卡二卡不卡视频查询 | 亚洲狠狠婷婷综合久久 | 国产av剧情md精品麻豆 | 精品成人av一区二区三区 | 偷窥村妇洗澡毛毛多 | 欧美成人高清在线播放 | 久精品国产欧美亚洲色aⅴ大片 | 永久黄网站色视频免费直播 | 国产性生交xxxxx无码 | 日本一区二区三区免费高清 | 国产乱码精品一品二品 | 18禁止看的免费污网站 | 精品国产一区av天美传媒 | 亚洲精品午夜无码电影网 | 天堂无码人妻精品一区二区三区 | 日韩在线不卡免费视频一区 | 久久久久人妻一区精品色欧美 | 久在线观看福利视频 | 熟妇人妻中文av无码 | 国产精品国产三级国产专播 | 国产suv精品一区二区五 | 久久久久免费看成人影片 | 国产人妻人伦精品1国产丝袜 | 国产成人无码区免费内射一片色欲 | 欧美日韩精品 | 欧美成人免费全部网站 | 又湿又紧又大又爽a视频国产 | 亚无码乱人伦一区二区 | 久久久精品国产sm最大网站 | 亚洲国产午夜精品理论片 | 国产网红无码精品视频 | 久久久久成人精品免费播放动漫 | 日本丰满熟妇videos | 国产精品igao视频网 | 粗大的内捧猛烈进出视频 | 国产精品美女久久久久av爽李琼 | 少妇邻居内射在线 | 中文字幕无线码 | 国内精品人妻无码久久久影院蜜桃 | 国产亚洲视频中文字幕97精品 | 久久午夜夜伦鲁鲁片无码免费 | 国产精品a成v人在线播放 | 亚洲精品综合一区二区三区在线 | 99er热精品视频 | 日本一卡二卡不卡视频查询 | 国产精品久久国产三级国 | 精品久久久久久亚洲精品 | 俺去俺来也在线www色官网 | 欧美成人免费全部网站 | 中文字幕无码人妻少妇免费 | 丁香花在线影院观看在线播放 | 中文字幕无码热在线视频 | 成人性做爰aaa片免费看 | 国语精品一区二区三区 | 搡女人真爽免费视频大全 | 国产精品办公室沙发 | 国产人妻精品一区二区三区 | 亚洲小说春色综合另类 | 久久国内精品自在自线 | 国产又粗又硬又大爽黄老大爷视 | 人人妻人人澡人人爽精品欧美 | 性做久久久久久久久 | 亚洲精品一区二区三区大桥未久 | 亚洲日本一区二区三区在线 | 乱中年女人伦av三区 | 国产黄在线观看免费观看不卡 | 天天爽夜夜爽夜夜爽 | 青草视频在线播放 | 一个人免费观看的www视频 | 国产激情无码一区二区 | 亚洲综合伊人久久大杳蕉 | 国产suv精品一区二区五 | 亚洲色偷偷男人的天堂 | 精品一二三区久久aaa片 | www一区二区www免费 | 国产偷国产偷精品高清尤物 | 国产超级va在线观看视频 | 丁香啪啪综合成人亚洲 | 久久精品国产精品国产精品污 | 97无码免费人妻超级碰碰夜夜 | 亚洲理论电影在线观看 | 99精品无人区乱码1区2区3区 | 国产午夜精品一区二区三区嫩草 | 久久综合给久久狠狠97色 | 麻豆国产人妻欲求不满谁演的 | 熟妇人妻无乱码中文字幕 | 欧美日韩亚洲国产精品 | 人妻天天爽夜夜爽一区二区 | 亚洲日韩中文字幕在线播放 | 给我免费的视频在线观看 | 国产成人亚洲综合无码 | 国产无遮挡吃胸膜奶免费看 | 国产午夜无码视频在线观看 | 中文字幕日韩精品一区二区三区 | 国产精品99久久精品爆乳 | 久久久久亚洲精品男人的天堂 | 一个人看的视频www在线 | 无码帝国www无码专区色综合 | 无码人妻av免费一区二区三区 | 国产人妻人伦精品 | 国产又爽又黄又刺激的视频 | 亚洲国产成人a精品不卡在线 | 国产人妻人伦精品1国产丝袜 | 色综合天天综合狠狠爱 | 18无码粉嫩小泬无套在线观看 | 性生交大片免费看女人按摩摩 | 久久久久久久久蜜桃 | 久久无码人妻影院 | 荡女精品导航 | 国产凸凹视频一区二区 | 亚洲精品一区国产 | 国产精品毛片一区二区 | 熟妇人妻无码xxx视频 | 国产性生大片免费观看性 | 日本乱偷人妻中文字幕 | 男人和女人高潮免费网站 | 乱人伦人妻中文字幕无码 | 国产精品无码mv在线观看 | 玩弄人妻少妇500系列视频 | 成人亚洲精品久久久久 | 中文字幕人妻丝袜二区 | 男女下面进入的视频免费午夜 | 久久久精品456亚洲影院 | 色偷偷人人澡人人爽人人模 | 国产熟女一区二区三区四区五区 | 久久久久久亚洲精品a片成人 | 国产偷自视频区视频 | 无码av岛国片在线播放 | 亚洲区小说区激情区图片区 | 亚洲成a人片在线观看日本 | 国产精品无套呻吟在线 | 国产精品久免费的黄网站 | 久久精品成人欧美大片 | 欧美黑人性暴力猛交喷水 | 中文字幕无线码 | 无码乱肉视频免费大全合集 | 最近免费中文字幕中文高清百度 | а√天堂www在线天堂小说 | 日本一区二区三区免费播放 | 亚洲色偷偷男人的天堂 | 久久精品视频在线看15 | 国产成人无码av片在线观看不卡 | 性生交大片免费看女人按摩摩 | 国产免费久久精品国产传媒 | 乱码av麻豆丝袜熟女系列 | 久久久久久亚洲精品a片成人 | 久久无码专区国产精品s | 亚洲欧美日韩国产精品一区二区 | 亚洲国产综合无码一区 | 少妇性l交大片欧洲热妇乱xxx | 久久这里只有精品视频9 | 极品尤物被啪到呻吟喷水 | 久久精品99久久香蕉国产色戒 | 久久综合九色综合97网 | 天天躁夜夜躁狠狠是什么心态 | 国产国语老龄妇女a片 | 两性色午夜视频免费播放 | 18禁黄网站男男禁片免费观看 | 水蜜桃亚洲一二三四在线 | 婷婷综合久久中文字幕蜜桃三电影 | 亚洲自偷自拍另类第1页 | 国内精品人妻无码久久久影院 | 内射爽无广熟女亚洲 | 老子影院午夜精品无码 | 久久久久亚洲精品中文字幕 | 亚洲va中文字幕无码久久不卡 | 精品人妻中文字幕有码在线 | 国产乱人无码伦av在线a | 亚洲成av人片天堂网无码】 | 人妻少妇被猛烈进入中文字幕 | 国产精品久久久午夜夜伦鲁鲁 | 中文字幕无码日韩专区 | 丰满护士巨好爽好大乳 | √天堂资源地址中文在线 | 久久精品中文字幕大胸 | 男女作爱免费网站 | 女人被爽到呻吟gif动态图视看 | 久久久久av无码免费网 | 日本大香伊一区二区三区 | 国产av一区二区精品久久凹凸 | 国产熟妇高潮叫床视频播放 | 国产精品福利视频导航 | 国产精品久久福利网站 | 欧美丰满熟妇xxxx性ppx人交 | 性色欲网站人妻丰满中文久久不卡 | 亚洲呦女专区 | 成 人影片 免费观看 | 中文字幕无码av激情不卡 | 麻豆av传媒蜜桃天美传媒 | 一二三四在线观看免费视频 | 亲嘴扒胸摸屁股激烈网站 | 无码人中文字幕 | 一本久久a久久精品亚洲 | 波多野结衣一区二区三区av免费 | 久久亚洲国产成人精品性色 | 精品久久久久香蕉网 | 亚洲成在人网站无码天堂 | 久久国语露脸国产精品电影 | 荫蒂被男人添的好舒服爽免费视频 | 51国偷自产一区二区三区 | 人妻尝试又大又粗久久 | 欧美黑人巨大xxxxx | 午夜理论片yy44880影院 | 熟妇女人妻丰满少妇中文字幕 | 国产精品-区区久久久狼 | 国产内射老熟女aaaa | 国产高潮视频在线观看 | 美女扒开屁股让男人桶 | 欧美第一黄网免费网站 | 动漫av网站免费观看 | 性欧美熟妇videofreesex | 中文字幕无线码免费人妻 | 日日鲁鲁鲁夜夜爽爽狠狠 | 熟妇人妻激情偷爽文 | 一个人免费观看的www视频 | 欧美精品无码一区二区三区 | 久久精品国产一区二区三区 | 夜先锋av资源网站 | 无人区乱码一区二区三区 | 久久亚洲a片com人成 | 精品亚洲成av人在线观看 | 国产女主播喷水视频在线观看 | 国产亚洲精品久久久久久久 | 少妇厨房愉情理9仑片视频 | 青青青手机频在线观看 | 一本久道久久综合狠狠爱 | 性生交片免费无码看人 | 国产成人无码av在线影院 | 久久99精品久久久久婷婷 | 人人爽人人澡人人人妻 | 亚洲国产一区二区三区在线观看 | 亚洲一区二区三区含羞草 | 婷婷六月久久综合丁香 | 天天躁日日躁狠狠躁免费麻豆 | 97色伦图片97综合影院 | 亚洲熟妇色xxxxx欧美老妇 | 伊人久久大香线焦av综合影院 | 亚洲乱亚洲乱妇50p | 日本一本二本三区免费 | 偷窥日本少妇撒尿chinese | 亚洲精品一区二区三区在线观看 | 日韩av无码中文无码电影 | 国产av久久久久精东av | 亚洲一区二区三区含羞草 | 装睡被陌生人摸出水好爽 | 沈阳熟女露脸对白视频 | 99麻豆久久久国产精品免费 | 伊在人天堂亚洲香蕉精品区 | 色 综合 欧美 亚洲 国产 | 老熟女重囗味hdxx69 | 国内少妇偷人精品视频 | 99久久亚洲精品无码毛片 | 图片区 小说区 区 亚洲五月 | 久久人妻内射无码一区三区 | 亚洲精品无码人妻无码 | 日本欧美一区二区三区乱码 | 98国产精品综合一区二区三区 | 熟妇人妻无乱码中文字幕 | 久久国产36精品色熟妇 | 精品无人国产偷自产在线 | 成人av无码一区二区三区 | 最近的中文字幕在线看视频 | 国产猛烈高潮尖叫视频免费 | 激情五月综合色婷婷一区二区 | 4hu四虎永久在线观看 | 久久午夜夜伦鲁鲁片无码免费 | 色欲综合久久中文字幕网 | 久久精品国产亚洲精品 | 中文字幕无码人妻少妇免费 | 狠狠躁日日躁夜夜躁2020 | 成 人影片 免费观看 | 天天做天天爱天天爽综合网 | 国产在线无码精品电影网 | 小sao货水好多真紧h无码视频 | 国产成人精品一区二区在线小狼 | 中文字幕人妻无码一夲道 | 久久久中文字幕日本无吗 | 国产黄在线观看免费观看不卡 | 蜜桃无码一区二区三区 | 77777熟女视频在线观看 а天堂中文在线官网 | 亚洲爆乳精品无码一区二区三区 | 国产精品久久久久9999小说 | 四虎国产精品免费久久 | a片在线免费观看 | 欧美日韩在线亚洲综合国产人 | 国产97人人超碰caoprom | 国产精品亚洲lv粉色 | 无码午夜成人1000部免费视频 | 亚洲欧美日韩成人高清在线一区 | 亚洲中文字幕无码中文字在线 | 成人免费视频一区二区 | 久久久久久国产精品无码下载 | 一个人免费观看的www视频 | av无码久久久久不卡免费网站 | 丝袜足控一区二区三区 | 亚洲国产精品无码一区二区三区 | av人摸人人人澡人人超碰下载 | 高清国产亚洲精品自在久久 | 色噜噜亚洲男人的天堂 | 99视频精品全部免费免费观看 | 色 综合 欧美 亚洲 国产 | 美女扒开屁股让男人桶 | 亚洲第一无码av无码专区 | 中文字幕久久久久人妻 | 欧美喷潮久久久xxxxx | 国产又粗又硬又大爽黄老大爷视 | 亚洲の无码国产の无码影院 | 欧美熟妇另类久久久久久不卡 | 精品国产av色一区二区深夜久久 | 人人妻人人澡人人爽欧美一区 | 成人欧美一区二区三区 | 中文字幕av无码一区二区三区电影 | v一区无码内射国产 | 亚洲欧美精品aaaaaa片 | 国产精品永久免费视频 | 精品厕所偷拍各类美女tp嘘嘘 | 无码国产色欲xxxxx视频 | 亚洲国产精品一区二区美利坚 | 漂亮人妻洗澡被公强 日日躁 | 国产69精品久久久久app下载 | 亚洲色偷偷男人的天堂 | www一区二区www免费 | 久久久精品456亚洲影院 | 伊在人天堂亚洲香蕉精品区 | 99久久人妻精品免费二区 | 超碰97人人做人人爱少妇 | 国产香蕉97碰碰久久人人 | 国产一区二区三区四区五区加勒比 | 亚洲国产精品久久人人爱 | 四虎国产精品免费久久 | 久久伊人色av天堂九九小黄鸭 | 麻豆果冻传媒2021精品传媒一区下载 | 樱花草在线社区www | 亚洲国产精品无码久久久久高潮 | 东京热一精品无码av | 午夜免费福利小电影 | 中文字幕亚洲情99在线 | 国产精品亚洲一区二区三区喷水 | 成 人影片 免费观看 | 奇米影视888欧美在线观看 | 日韩av无码一区二区三区不卡 | 亚洲色欲久久久综合网东京热 | 红桃av一区二区三区在线无码av | 四虎永久在线精品免费网址 | av无码电影一区二区三区 | 亚洲日韩av片在线观看 | 装睡被陌生人摸出水好爽 | 久久久久久a亚洲欧洲av冫 | 全黄性性激高免费视频 | 色 综合 欧美 亚洲 国产 | 99久久久国产精品无码免费 | 国产精品二区一区二区aⅴ污介绍 | 亚洲精品午夜国产va久久成人 | 国内精品九九久久久精品 | 丰满少妇高潮惨叫视频 | 亚洲男人av香蕉爽爽爽爽 | 亚洲 高清 成人 动漫 | 在线天堂新版最新版在线8 | 黑人粗大猛烈进出高潮视频 | 美女黄网站人色视频免费国产 | 97夜夜澡人人双人人人喊 | 无码纯肉视频在线观看 | 久久久久久九九精品久 | 亚洲七七久久桃花影院 | 国产极品美女高潮无套在线观看 | 无码一区二区三区在线 | 天堂а√在线地址中文在线 | 亚洲一区二区三区香蕉 | 欧美35页视频在线观看 | 日本一卡二卡不卡视频查询 | 丰满少妇人妻久久久久久 | 波多野42部无码喷潮在线 | 国产精品多人p群无码 | 精品aⅴ一区二区三区 | 熟妇人妻激情偷爽文 | 久久国产36精品色熟妇 | 在线成人www免费观看视频 | 国产莉萝无码av在线播放 | 国产乡下妇女做爰 | 色窝窝无码一区二区三区色欲 | 国产无av码在线观看 | 成人毛片一区二区 | 免费看男女做好爽好硬视频 | 日韩av无码中文无码电影 | 秋霞特色aa大片 | 欧美成人午夜精品久久久 | 99久久久无码国产精品免费 | 熟女俱乐部五十路六十路av | 99er热精品视频 | 麻豆精产国品 | 中文毛片无遮挡高清免费 | 精品久久久中文字幕人妻 | √8天堂资源地址中文在线 | 乌克兰少妇xxxx做受 | 国产无遮挡又黄又爽免费视频 | 一本久久a久久精品亚洲 | 无码国产乱人伦偷精品视频 | 国产无av码在线观看 | 男女下面进入的视频免费午夜 | 免费国产成人高清在线观看网站 | 国产成人精品必看 | 亚洲成a人一区二区三区 | 国产成人精品必看 | 人人澡人摸人人添 | 国色天香社区在线视频 | 精品国产精品久久一区免费式 | 亚洲色在线无码国产精品不卡 | 国产国产精品人在线视 | 精品亚洲韩国一区二区三区 | 夜夜躁日日躁狠狠久久av | 国内精品九九久久久精品 | 高潮毛片无遮挡高清免费视频 | 99久久久国产精品无码免费 | 夫妻免费无码v看片 | 青青青手机频在线观看 | 国色天香社区在线视频 | 无套内谢的新婚少妇国语播放 | 97人妻精品一区二区三区 | 女人色极品影院 | 欧美 日韩 亚洲 在线 | 国产成人无码av片在线观看不卡 | 欧美自拍另类欧美综合图片区 | 欧美日韩人成综合在线播放 | 亚洲欧美日韩国产精品一区二区 | 久久久久亚洲精品中文字幕 | 天堂а√在线地址中文在线 | 久久国语露脸国产精品电影 | 欧美日韩视频无码一区二区三 | 永久免费观看国产裸体美女 | 国産精品久久久久久久 | 一个人看的视频www在线 | 1000部啪啪未满十八勿入下载 | 久久国产精品偷任你爽任你 | 成人无码精品1区2区3区免费看 | 狠狠躁日日躁夜夜躁2020 | 亚洲国产日韩a在线播放 | 亚洲精品久久久久中文第一幕 | 国产黄在线观看免费观看不卡 | 99久久亚洲精品无码毛片 | 激情内射亚州一区二区三区爱妻 | 影音先锋中文字幕无码 | 久久精品女人天堂av免费观看 | 狠狠色噜噜狠狠狠狠7777米奇 | 女人被爽到呻吟gif动态图视看 | 欧美阿v高清资源不卡在线播放 | 亚洲熟熟妇xxxx | 国产亚洲精品久久久闺蜜 | 亚洲成色www久久网站 | 国产精品美女久久久久av爽李琼 | 成人av无码一区二区三区 | 国产性生大片免费观看性 | 任你躁国产自任一区二区三区 | 无码人妻丰满熟妇区五十路百度 | 少妇太爽了在线观看 | 高清国产亚洲精品自在久久 | 中文字幕+乱码+中文字幕一区 | 红桃av一区二区三区在线无码av | 日本精品人妻无码77777 天堂一区人妻无码 | 国产办公室秘书无码精品99 | 无套内谢老熟女 | 乌克兰少妇xxxx做受 | 黑人玩弄人妻中文在线 | 亚洲一区二区观看播放 | 一个人看的www免费视频在线观看 | 国产在线精品一区二区三区直播 | 国产高清av在线播放 | 国产麻豆精品一区二区三区v视界 | 欧美老熟妇乱xxxxx | 国产特级毛片aaaaaa高潮流水 | 俺去俺来也在线www色官网 | 精品久久久久久亚洲精品 | 亚洲国产av美女网站 | 欧美午夜特黄aaaaaa片 | 久久亚洲国产成人精品性色 | 成人无码精品1区2区3区免费看 | 日日鲁鲁鲁夜夜爽爽狠狠 | 丰满肥臀大屁股熟妇激情视频 | 人人妻在人人 | 精品乱子伦一区二区三区 | 国产极品美女高潮无套在线观看 | 久久精品国产亚洲精品 | 欧洲vodafone精品性 | 久久久久久久久蜜桃 | √天堂中文官网8在线 | 亚洲熟妇色xxxxx亚洲 | 狠狠色丁香久久婷婷综合五月 | 99久久精品无码一区二区毛片 | 最近免费中文字幕中文高清百度 | 国产精品对白交换视频 | 免费人成在线视频无码 | 久久这里只有精品视频9 | 少妇人妻av毛片在线看 | 色妞www精品免费视频 | 天堂在线观看www | 久久国产精品_国产精品 | 国产激情一区二区三区 | 欧美freesex黑人又粗又大 | 亚洲精品久久久久久一区二区 | 荫蒂被男人添的好舒服爽免费视频 | 一本加勒比波多野结衣 | 国产精品人妻一区二区三区四 | 免费无码午夜福利片69 | 亚洲成a人一区二区三区 | 成人精品视频一区二区三区尤物 | 1000部啪啪未满十八勿入下载 | 久久精品中文字幕一区 | 无码播放一区二区三区 | 亚洲伊人久久精品影院 | 99久久精品国产一区二区蜜芽 | 少妇愉情理伦片bd | 国产精品久久久久7777 | 欧美日韩一区二区三区自拍 | 大肉大捧一进一出视频出来呀 | 黑森林福利视频导航 | 亚洲中文字幕久久无码 | 久久久www成人免费毛片 | 成人试看120秒体验区 | 国产熟妇高潮叫床视频播放 | 亚洲va中文字幕无码久久不卡 | 亚洲性无码av中文字幕 | 亚洲人交乣女bbw | 欧美国产亚洲日韩在线二区 | 少妇太爽了在线观看 | 欧美第一黄网免费网站 | 欧美一区二区三区视频在线观看 | 亚洲成a人片在线观看无码3d | 国产熟妇高潮叫床视频播放 | 亚洲精品综合一区二区三区在线 | 丁香啪啪综合成人亚洲 | 色综合视频一区二区三区 | 亚洲成av人综合在线观看 | 色综合久久中文娱乐网 | 熟妇女人妻丰满少妇中文字幕 | 亚洲中文字幕在线无码一区二区 | 免费无码一区二区三区蜜桃大 | 欧美zoozzooz性欧美 | 日本精品人妻无码77777 天堂一区人妻无码 | 四虎影视成人永久免费观看视频 | 成熟妇人a片免费看网站 | 熟女少妇在线视频播放 | 小鲜肉自慰网站xnxx | 一本精品99久久精品77 | аⅴ资源天堂资源库在线 | 国产熟女一区二区三区四区五区 | 成人性做爰aaa片免费看不忠 | 亚洲熟悉妇女xxx妇女av | 超碰97人人射妻 | 波多野42部无码喷潮在线 | 久久久www成人免费毛片 | 亚洲va欧美va天堂v国产综合 | 无码精品国产va在线观看dvd | 久久综合色之久久综合 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 最近中文2019字幕第二页 | 久久久婷婷五月亚洲97号色 | 樱花草在线播放免费中文 | 亚洲国产av美女网站 | 国产黄在线观看免费观看不卡 | 国产精品久免费的黄网站 | 久久99精品国产.久久久久 | 99久久久无码国产精品免费 | 亚洲国产成人a精品不卡在线 | 国产精品香蕉在线观看 | 国产69精品久久久久app下载 | 国产精品人妻一区二区三区四 | 国产一区二区三区四区五区加勒比 | 国产精品理论片在线观看 | 美女扒开屁股让男人桶 | 强辱丰满人妻hd中文字幕 | 亚洲一区二区三区偷拍女厕 | 精品少妇爆乳无码av无码专区 | 亚洲色欲色欲天天天www | 国产在线无码精品电影网 | 亚洲天堂2017无码中文 | 国产在线精品一区二区三区直播 | 99精品视频在线观看免费 | 欧美三级不卡在线观看 | 日韩欧美成人免费观看 | 东京无码熟妇人妻av在线网址 | 国产精品久久久午夜夜伦鲁鲁 | 久久亚洲a片com人成 | 国产成人综合在线女婷五月99播放 | 久久久久av无码免费网 | 久久久久免费精品国产 | 成人欧美一区二区三区黑人 | 97久久精品无码一区二区 | 成人毛片一区二区 | 亚洲中文字幕无码中文字在线 | 欧美老熟妇乱xxxxx | 青草青草久热国产精品 | www国产亚洲精品久久久日本 | 大胆欧美熟妇xx | 精品国产一区二区三区av 性色 | 日本成熟视频免费视频 | 无码免费一区二区三区 | 久久综合香蕉国产蜜臀av | 精品久久久无码人妻字幂 | 在线欧美精品一区二区三区 | 久久人人爽人人爽人人片av高清 | 狠狠色噜噜狠狠狠狠7777米奇 | 午夜肉伦伦影院 | 久久久久国色av免费观看性色 | 强奷人妻日本中文字幕 | 99精品国产综合久久久久五月天 | 女人被男人躁得好爽免费视频 | 国产精品香蕉在线观看 | 999久久久国产精品消防器材 | 成人免费视频视频在线观看 免费 | 国产精品高潮呻吟av久久 | 亚洲成a人片在线观看无码3d | 色综合久久久无码中文字幕 | 日韩精品一区二区av在线 | 国产小呦泬泬99精品 | 日韩精品乱码av一区二区 | 人人妻人人澡人人爽欧美一区九九 | 婷婷五月综合缴情在线视频 | 精品国产一区av天美传媒 | 国产成人无码午夜视频在线观看 | 久久国内精品自在自线 | 亚洲精品www久久久 | 成在人线av无码免费 | 国内老熟妇对白xxxxhd | 天天拍夜夜添久久精品大 | 日韩人妻无码一区二区三区久久99 | 高潮喷水的毛片 | 中文字幕av无码一区二区三区电影 | 日本一卡二卡不卡视频查询 | 欧美亚洲日韩国产人成在线播放 | 一本久久a久久精品亚洲 | 人妻有码中文字幕在线 | 中文字幕亚洲情99在线 | 夫妻免费无码v看片 | 国产真实夫妇视频 | 精品国产福利一区二区 | 成人欧美一区二区三区 | 亚洲精品国产a久久久久久 | 色综合久久久无码中文字幕 | 偷窥村妇洗澡毛毛多 | 久久国产劲爆∧v内射 | 国产99久久精品一区二区 | 国产免费观看黄av片 | 亚洲 高清 成人 动漫 | 极品尤物被啪到呻吟喷水 | 亚洲一区av无码专区在线观看 | 久久亚洲精品中文字幕无男同 | a在线亚洲男人的天堂 | 欧洲精品码一区二区三区免费看 | 久久99精品久久久久久动态图 | 国产成人精品优优av | 女人被男人躁得好爽免费视频 | 亚洲日本一区二区三区在线 | 18精品久久久无码午夜福利 | 精品国产av色一区二区深夜久久 | 乱中年女人伦av三区 | 久久亚洲中文字幕无码 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产亚洲人成在线播放 | 国产真人无遮挡作爱免费视频 | 精品无码av一区二区三区 | 又大又紧又粉嫩18p少妇 | 国产精品无码成人午夜电影 | 欧美成人免费全部网站 | 国产精品第一区揄拍无码 | 香港三级日本三级妇三级 |