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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

上下伸缩代码_CQRS之旅——旅程4(扩展和增强订单和注册限界上下文)

發布時間:2024/7/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 上下伸缩代码_CQRS之旅——旅程4(扩展和增强订单和注册限界上下文) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

旅程4:擴展和增強訂單和注冊限界上下文

進一步探索訂單和注冊的有界上下文。“我明白,如果一個人想看些新鮮的東西,旅行并不是沒有意義的。”儒勒·凡爾納,環游世界80天

對限界上下文的更改:

前一章詳細描述了訂單和注冊限界上下文。本章描述了在CQRS之旅的第二階段,團隊在這個限界上下文中所做的一些更改。

本章的主題包括:

  • 改進RegistrationProcessManager類中消息相關的工作方式。這說明了限界上下文中的聚合實例如何以復雜的方式進行交互。
  • 實現一個記錄定位器,使注冊者能夠檢索她在前一個會話中保存的訂單。這說明了如何向寫端(Write Side)添加一些額外的邏輯,使您能夠在不知道聚合實例惟一ID的情況下定位它。
  • 在UI中添加一個倒計時器,使注冊者能夠跟蹤他們需要在多長時間內完成訂單。這說明了對寫端(Write Side)進行的增強,以支持在UI中顯示豐富的信息。
  • 同時支持多種座位類型的預定。例如,注冊者為會前的活動申請5個座位,為會議申請8個座位。這需要在寫端(Write Side)使用更復雜的業務邏輯。
  • CQRS命令驗證。這說明了如何在將CQRS命令發送到領域之前使用MVC中的模型驗證特性來驗證它們。

本章描述的Contoso會議管理系統并不是該系統的最終版本。本旅程描述的是一個過程,因此一些設計決策和實現細節將在過程的后續步驟中更改。這些變化將在后面的章節中描述。

本章的工作術語定義:

本章使用了一些術語,我們將在下面進行描述。有關更多細節和可能的替代定義,請參閱參考指南中的“深入CQRS和ES”。

  • 命令(Command):命令是要求系統執行更改系統狀態的操作。命令是必須服從(執行)的一種指令,例如:MakeSeatReservation。在這個限界上下文中,命令要么來自用戶發起請求時的UI,要么來自流程管理器(當流程管理器指示聚合執行某個操作時)。單個接收方處理一個命令。命令總線(command bus)傳輸命令,然后命令處理程序將這些命令發送到聚合。發送命令是一個沒有返回值的異步操作。
  • 事件(Event):事件就是系統中發生的一些事情,通常是一個命令的結果。領域模型中的聚合會引發(raise)事件。多個事件訂閱者(subscribers)可以處理特定的事件。聚合將事件發布到事件總線, 處理程序訂閱特定類型的事件,事件總線(event bus)將事件傳遞給訂閱者。在這個限界上下文中,唯一的訂閱者是流程管理器。
  • 流程管理器。在這個限界上下文中,流程管理器是一個協調領域域中聚合行為的類。流程管理器訂閱聚合引發的事件,然后遵循一組簡單的規則來確定發送一個或一組命令。流程管理器不包含任何業務邏輯,它唯一的邏輯是確定下一個發送的命令。流程管理器被實現為一個狀態機,因此當它響應一個事件時,除了發送一個新命令外,還可以更改其內部狀態。
    Gregor Hohpe和Bobby Woolf合著的《Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions》(Addison-Wesley Professional, 2003)書中312頁講述了流程管理器實現模式。我們的流程管理器就是依照這個模式實現的。

用戶故事(User stories)

除了描述訂單和注冊限界上下文的一些更改和增強之外,本章還討論了兩個用戶故事的實現。

使用記錄定位器作為登錄

當注冊者創建會議座位的訂單時,系統生成一個5個字符的訂單訪問代碼,并通過電子郵件發送給注冊者。登記人可以使用她的電子郵件地址和會議系統網站上的訂單訪問代碼作為記錄定位器,以便稍后從系統中檢索訂單。注冊者可能希望檢索訂單以查看它,或者通過分配與會者到座位來完成注冊過程。

Carlos(領域專家)發言:
從商業的角度來看,對我們來說,盡可能地做到用戶友好是很重要的。我們不想阻止或不必要地增加任何試圖注冊會議的人的負擔。因此,我們不要求用戶在注冊之前在系統中創建帳戶,特別是要求用戶無論如何都必須在標準的結帳過程中輸入大部分信息。

告訴會議注冊者還剩余多少時間來完成訂單

當注冊者創建一個訂單時,系統將保留注冊者請求的座位,直到完成訂單或預訂過期。要完成訂單,注冊者必須提交她的詳細信息,如姓名和電子郵件地址,并成功付款。

為了幫助注冊者,系統會顯示一個倒計時計時器,告訴她還有多少時間可以在預定到期前完成訂單。

使注冊者能夠創建包含多個座位類型的訂單

當注冊者創建一個訂單,她可以申請不同數量的座位,并且這些座位類型可以不相同。例如,登記人可要求五個會議座位和三個會前講習班座位。

架構

該應用程序旨在部署到Microsoft Azure。在旅程的這個階段,應用程序由兩個角色組成,一個包含http://ASP.Net MVC Web應用程序的web角色和一個包含消息處理程序和領域對象的工作角色。應用程序在寫端和讀端都使用Azure SQL DataBase實例進行數據存儲。應用程序使用Azure服務總線來提供其消息傳遞基礎設施。下圖展示了這個高級體系結構。

在研究和測試解決方案時,可以在本地運行它,可以使用Azure compute emulator,也可以直接運行MVC web應用程序,并運行承載消息處理程序和領域域對象的控制臺應用程序。在本地運行應用程序時,可以使用本地SQL Server Express數據庫,并使用一個在SQL Server Express數據庫實現的簡單的消息傳遞基礎設施。

有關運行應用程序的選項的更多信息,請參見附錄1“發布說明”。

模式和概念

本節介紹了在團隊旅程的當前階段,應用程序的一些關鍵地方,并介紹了團隊在處理這些地方時遇到的一些挑戰。

記錄定位器

該系統使用訪問碼而不是密碼,這樣注冊者就不會被迫在該系統中設置帳戶。許多注冊者可能只使用系統一次,因此不需要創建一個帶有用戶ID和密碼的永久帳戶。

系統需要能夠根據注冊者的電子郵件地址和訪問代碼快速檢索訂單信息。為了提供最低程度的安全性,系統生成的訪問代碼不應該是可預測的,注冊者可以檢索的訂單信息不應該包含任何敏感信息。

在讀端查詢數據

前一章重點介紹了寫端模型及其實現,在本章中,我們將更詳細地探討讀端的實現。特別地,我們將解釋如何從MVC控制器實現讀取模型和查詢機制。

在對CQRS模式的初步研究中,團隊決定使用數據庫中的SQL視圖作為讀取端MVC控制器查詢數據的基礎數據源。為了最小化讀端查詢必須執行的工作,這些SQL視圖提供了數據的反規范化(denormalised)版本。這些視圖目前與寫模型使用的規范化(normalized)表存在同一個數據庫中。

Jana(軟件架構師)發言:
該團隊將把數據庫分為兩個部分,并在旅程的后期將探索其他的選擇來從規范化的寫端推送數據到反規范化的讀端。有關使用Azure blob存儲而不是SQL表存儲讀取端數據的示例,請參見SeatAssignmentsViewModelGenerator類。

在數據庫存儲反規范化的視圖

存儲讀端數據的一個常見選項是使用一組關系數據庫表來保存。您應該優化讀取端以實現快速讀取,因此存儲規范化數據通常沒有任何好處,因為這將需要復雜的查詢來為客戶端構造數據。這意味著讀取端的目標應該是使查詢盡可能簡單,并以能夠快速有效地讀取的方式在數據庫中構建表。

Gary(CQRS專家)發言:
當人們選擇使用CQRS模式時,可伸縮的應用程序和響應式UI通常是明確的目標。優化讀端以提供對查詢的快速響應,同時保持資源利用率較低,這將幫助您實現這些目標。Jana(軟件架構師)發言:
由于表連接操作過多,規范化數據庫模式可能無法提供足夠快的響應時間。盡管關系數據庫技術有所進步,但是與單表讀取相比,JOIN操作仍然非常昂貴。
譯者注:讀取端/查詢端通常就是所說的前端UI,如果使用關系型數據庫的關系表來存儲UI層要展現的頁面數據。每次讀取都需要做連接查詢或多次查詢。所以把讀取端需要的數據保存為反規范的數據可以實現快速讀取。這個反規范化(denormalised)可以簡單理解為,拋棄關系型數據庫的關系,存儲非關系型的數據。

一個需要重要考慮的地方就是讀取端用來查詢數據的接口。讀取端就如http://ASP.Net MVC程序Controller的Action里發起的查詢請求。

在下圖中,讀取端(如MVC Controller里的Action)調用ViewRepository類上的方法來請求它需要的數據。然后,ViewRepository類對數據庫中的非規范化數據運行查詢。

Jana(軟件架構師)發言:
倉儲(Repository)模式使用類似集合的接口在領域和數據映射層之間進行轉換,以訪問領域對象。有關更多信息,請參考Martin Fowler,Catalog of Patterns of Enterprise Application Architecture,Repository。

Contoso的團隊評估了實現ViewRepository類的兩種方法:使用IQueryable接口和使用非通用的數據訪問對象(DAOs)。

使用IQueryable接口

ViewRepository類考慮的一種方法是讓它返回一個IQueryable實例,該實例允許客戶端使用LINQ來指定其查詢。返回IQueryable實例很簡單,很多ORM框架都可以,例如Entity Framework或NHibernate,下面的代碼片段演示了客戶端如何做此類查詢。

var ordersummary = repository.Query<OrderSummary>().Where(LINQ query to retrieve order summary); var orderdetails = repository.Query<OrderDetails>().Where(LINQ query to retrieve order details);

這種方法有幾個優點:

簡單

  • 這種方法在底層數據庫上使用一個薄的抽象層。許多ORM都支持這種方法,它將您必須編寫的代碼量降到最低。
  • 您只需要定義一個倉儲和一個查詢方法。
  • 您不需要單獨的查詢對象。在讀端,查詢應該很簡單,因為您已經對寫端數據進行了反規范化,以支持讀端。
  • 可以使用LINQ在客戶端上提供對過濾、分頁和排序等特性的支持。

可測試性

  • 您可以使用LINQ to object進行Mocking。
Markus(軟件開發人員)發言:
在參考實現(RI)中,我們使用Entity Framework,我們根本不需要編寫任何代碼來獲取IQueryable實例。我們也只有一個ViewRepository類。

可能有人反對這個方法,包括:

  • 把數據存儲層替換為非關系型數據庫將很不容易,因為需要提供IQueryable實例。但無論如何,您總是可以為不同的限界上下文選擇使用適合的,不同的讀取端實現方式。
  • 客戶端在執行操作的時候可能會濫用IQueryable接口,您應該確保非規范化的數據完全滿足客戶的需求。
  • 使用IQueryable接口隱藏了查詢辦法。但是,由于在寫端對數據進行過反規范化,因此對關系數據庫表的查詢沒辦法做更復雜的查詢。
  • 很難知道您的集成測試是否覆蓋了查詢方法的所有不同用途。

使用非通用DAOs

另一種方法是讓ViewRepository暴露出一個Find方法和一個Get方法,如下面的代碼片段所示。

var ordersummary = dao.FindAllSummarizedOrders(userId); var orderdetails = dao.GetOrderDetails(orderId);

您還可以選擇使用不同的DAO類。這將使訪問不同數據源變得更容易。

var ordersummary = OrderSummaryDAO.FindAll(userId); var orderdetails = OrderDetailsDAO.Get(orderId);

這種方法有幾個優點:

簡單

  • 對客戶端來說,依賴關系更加清晰。例如,客戶端引用一個顯式的IOrderSummaryDAO實例,而不是一個通用的IViewRepository實例。 對于大多數查詢,只有一到兩種預定義的訪問對象的方法。不同的查詢通常返回不同的投射。

靈活性

  • Get和Find方法隱藏了數據存儲分區的細節,還隱藏了使用ORM或顯式執行SQL代碼等數據訪問方法。這使得將來更容易改變這些選擇。 Get和Find方法可以使用ORM、LINQ和IQueryable接口在背后從數據存儲中獲取數據。這是一個選擇,您可以建立在一個方法接一個方法的基礎上。

性能

  • 您可以輕松地優化Find和Get方法運行的查詢。數據訪問層執行所有查詢。客戶端沒有任何風險試圖去做復雜的效率低的查詢。

可測試性

  • 為Find和Get方法創建單元測試要比為客戶端所有可能的LINQ查詢范圍創建合適的單元測試更容易。

可維護性

  • 所有查詢都定義在相同的位置DAO類中,從而更容易一致地修改系統。

對這個方法可能的反對意見包括:

使用IQueryable接口可以更容易地在UI中支持分頁、過濾和排序等功能。無論如何,如果開發人員意識到這一缺點并盡力交付基于任務的UI,那么這應該不是問題。

把部分已完成的訂單信息提供給讀取端

UI層通過在讀取端查詢模型獲得的訂單數據來顯示。UI顯示給注冊者的部分數據是關于部分已完成訂單的信息:訂單中的每種座位類型,請求的座位數量和可用的座位數量。這是系統僅在注冊者使用UI創建訂單時使用的臨時數據。企業只需要存儲關于實際購買座位的信息,而不需要存儲注冊者請求的座位和注冊者購買的座位之間的差異。

這樣做的結果是,關于注冊者請求多少座位的信息只需要存在于讀取端模型中。

Jana(軟件架構師)發言:
您不能將此信息存儲在HTTP Session中,因為注冊者可能在請求座位和完成訂單之間離開站點。

進一步的結果是,讀端的底層存儲不能是簡單的SQL視圖,因為它包含的數據沒有存儲在寫端的底層表存儲中。因此,必須使用事件將此信息傳遞給讀取方。

下面的架構圖顯示了訂單(Order)和可用座位(SeatsAvailability)聚合使用的所有命令和事件,以及訂單(Order)聚合如何通過引發事件將更改推送到讀取端。

OrderViewModelGenerator類處理OrderPlaced、OrderUpdated、OrderPartiallyReserved、OrderRegistrantAssigned和OrderReservationCompleted事件,并使用DraftOrder和DraftOrderItem實例將更改持久化到視圖表中。

Gary(CQRS專家)發言:
如果您提前閱讀第5章“準備發布V1版本”,您將看到團隊擴展了事件的使用,并遷移了訂單和注冊上下文,以使用事件源。

CQRS命令校驗

在實現寫模型時,應該盡量確保命令很少失敗。這將提供最佳的用戶體驗,并使您的應用程序更容易實現異步行為。

團隊采用的一種方法是使用http://ASP.NET MVC中的模型驗證功能。

您應該小心區分系統錯誤和業務錯誤。系統錯誤的例子包括:

  • 由于消息傳遞基礎設施出現故障,無法傳遞消息。
  • 由于與數據庫的連接問題,數據沒有持久化。

在許多情況下,特別是在云中,您可以通過重試操作來處理這些錯誤。

Markus(軟件開發人員)發言:
來自Microsoft patterns & practices的Transient Fault Handling Application Block的設計目的是使任何Transient Fault更容易實現一致的重試行為。它提供了一組針對Azure SQL數據庫、Azure存儲、Azure緩存和Azure服務總線的內置檢測策略,還允許您定義自己的策略。類似地,它提供了一組方便的內置重試策略,并支持自定義策略。更多信息請參見The Transient Fault Handling Application Block

業務錯誤應該有預先定好的邏輯響應。例如:

  • 如果系統因為沒有剩余的座位而無法預訂座位,那么它應該將請求添加到等待列表中。
  • 如果信用卡支付失敗,用戶應該有機會嘗試另一種信用卡,或者使用發票付款。
Gary(CQRS專家)發言:
您的領域專家應該幫助您識別可能發生的業務失敗,并確定您處理它們的方法:使用自動化流程或手動方式。

倒計時器和讀取模型

向注冊者顯示完成訂單所需時間的倒計時器是系統中的業務的一部分,而不僅僅是基礎設施的一部分。當注冊者創建一個訂單并預訂座位時,倒計時就開始了。即使登記人離開會議網站,倒計時仍在繼續。如果注冊用戶返回網站,UI必須能夠顯示正確的倒計時值,因此,保留過期時間是讀模型中可用數據的一部分。

實現細節

本節描述訂單和注冊限界上下文的實現的一些重要特性。您可能會發現擁有一份代碼副本很有用,這樣您就可以繼續學習了。您可以從Download center下載一個副本,或者在GitHub上查看存儲庫中的代碼:https://github.com/mspnp/cqrs- jourcode

不要期望代碼示例與參考實現中的代碼完全匹配。本章描述了CQRS過程中的一個步驟,但是隨著我們了解更多并重構代碼,實現可能會發生變化。

訂單訪問代碼和記錄定位器

注冊者可能需要檢索訂單,或者查看訂單,或者完成對參會人員座位的分配。這可能發生在不同的web會話中,因此注冊者必須提供一些信息來定位以前保存的訂單。

下面的代碼示例顯示Order類如何生成一個新的五個字符的訂單訪問代碼,該代碼作為Order實例的一部分被持久化。

public string AccessCode { get; set; }protected Order() {...this.AccessCode = HandleGenerator.Generate(5); }

要檢索訂單實例,注冊者必須提供其電子郵件地址和訂單訪問代碼。系統將使用這兩項來定位正確的Order。這是讀取端的邏輯。

下面的代碼示例來自web應用程序中的OrderController類,展示了MVC控制器如何使用LocateOrder方法向讀取端提交查詢,以發現唯一的OrderId值。這個Find action將OrderId值傳遞給一個Display action,該action將訂單信息顯示給注冊者。

[HttpPost] public ActionResult Find(string email, string accessCode) {var orderId = orderDao.LocateOrder(email, accessCode);if (!orderId.HasValue){return RedirectToAction("Find", new { conferenceCode = this.ConferenceCode });}return RedirectToAction("Display", new { conferenceCode = this.ConferenceCode, orderId = orderId.Value }); }

倒計時器

當注冊者創建一個訂單并預訂座位時,這些座位將保留一段固定的時間。RegistrationProcessManager實例將預訂從可用座位(SeatsAvailability)聚合中轉發,它將預訂過期的時間傳遞給訂單(Order)聚合。下面的代碼示例顯示訂單(Order)聚合如何接收和存儲預訂過期時間。

public DateTime? ReservationExpirationDate { get; private set; }public void MarkAsReserved(DateTime expirationDate, IEnumerable<SeatQuantity> seats) {...this.ReservationExpirationDate = expirationDate;this.Items.Clear();this.Items.AddRange(seats.Select(seat => new OrderItem(seat.SeatType, seat.Quantity))); } Markus(軟件開發人員)發言:
在Order的構造函數中,ReservationExpirationDate最初被設置為在Order實例化后的15分鐘。RegistrationProcessManager類可能會根據實際預訂的時間進行修改。實際時間指的是流程管理器向訂單(Order)聚合發送MarkSeatsAsReserved命令的時間。

當RegistrationProcessManager將MarkSeatsAsReserved命令發送到訂單(Order)聚合(攜帶UI將顯示的過期時間)時,它還向自己發送一條命令,以啟動釋放預訂座位的過程。這個ExpireRegistrationProcess命令在過期區間加上一個5分鐘的緩沖來保存。這個緩沖是為了確保服務器之間的時間差不會導致RegistrationProcessManager類在UI中的倒計時器清零之前就釋放預留的座位。下面的代碼示例展示RegistrationProcessManager類,UI使用MarkSeatsAsReserved命令中的Expiration屬性來顯示倒計時器,而ExpireRegistrationProcess命令中的Delay屬性確定何時釋放保留的座位。

public void Handle(SeatsReserved message) {if (this.State == ProcessState.AwaitingReservationConfirmation){var expirationTime = this.ReservationAutoExpiration.Value;this.State = ProcessState.ReservationConfirmationReceived;if (this.ExpirationCommandId == Guid.Empty){var bufferTime = TimeSpan.FromMinutes(5);var expirationCommand = new ExpireRegistrationProcess { ProcessId = this.Id };this.ExpirationCommandId = expirationCommand.Id;this.AddCommand(new Envelope<ICommand>(expirationCommand){Delay = expirationTime.Subtract(DateTime.UtcNow).Add(bufferTime),});}this.AddCommand(new MarkSeatsAsReserved{OrderId = this.OrderId,Seats = message.ReservationDetails.ToList(),Expiration = expirationTime,});}... }

MVC項目中的RegistrationController類在讀取端檢索訂單信息。DraftOrder類包含控制器使用ViewBag類傳遞給視圖的預約過期時間,如下面的代碼示例所示。

[HttpGet] public ActionResult SpecifyRegistrantDetails(string conferenceCode, Guid orderId) {var repo = this.repositoryFactory();using (repo as IDisposable){var draftOrder = repo.Find<DraftOrder>(orderId);var conference = repo.Query<Conference>().Where(c => c.Code == conferenceCode).FirstOrDefault();this.ViewBag.ConferenceName = conference.Name;this.ViewBag.ConferenceCode = conference.Code;this.ViewBag.ExpirationDateUTCMilliseconds = draftOrder.BookingExpirationDate.HasValue ? ((draftOrder.BookingExpirationDate.Value.Ticks - EpochTicks) / 10000L) : 0L;this.ViewBag.OrderId = orderId;return View(new AssignRegistrantDetails { OrderId = orderId });} }

然后MVC的視圖使用JavaScript顯示動畫倒計時器。

使用http://ASP.NET MVC validation來驗證命令

您應該確保應用程序中的MVC控制器發送給寫模型的任何命令都將成功。在將命令發送到寫模型之前,可以使用MVC中的特性在客戶端和服務器端驗證命令。

Markus(軟件開發人員)發言:
客戶端驗證對用戶來說主要是比較方便,因為它不用往返于服務器就可以幫助用戶正確完成表單填寫。但您仍然需要實現服務器端驗證,以確保在將數據轉發到寫模型之前對其進行過驗證。

下面的代碼示例顯示了AssignRegistrantDetails命令類,它使用DataAnnotations指定驗證需求;在本例中,要求FirstName、LastName和Email字段不為空。

using System; using System.ComponentModel.DataAnnotations; using Common;public class AssignRegistrantDetails : ICommand {public AssignRegistrantDetails(){this.Id = Guid.NewGuid();}public Guid Id { get; private set; }public Guid OrderId { get; set; }[Required(AllowEmptyStrings = false)]public string FirstName { get; set; }[Required(AllowEmptyStrings = false)]public string LastName { get; set; }[Required(AllowEmptyStrings = false)]public string Email { get; set; } }

MVC視圖使用這個命令類作為它的模型類。下面的代碼示例來自SpecifyRegistrantDetails.cshtml文件,它顯示了如何填充模型。

@model Registration.Commands.AssignRegistrantDetails...<div class="editor-label">@Html.LabelFor(model => model.FirstName)</div><div class="editor-field">@Html.EditorFor(model => model.FirstName)</div> <div class="editor-label">@Html.LabelFor(model => model.LastName)</div><div class="editor-field">@Html.EditorFor(model => model.LastName)</div> <div class="editor-label">@Html.LabelFor(model => model.Email)</div><div class="editor-field">@Html.EditorFor(model => model.Email)</div>

Web.config文件根據DataAnnotations屬性配置客戶端驗證,如下面的代碼片段所示:

<appSettings>...<add key="ClientValidationEnabled" value="true" /><add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings>

服務器端驗證發生在發送命令之前的控制器中。下面來自RegistrationController類的代碼示例展示了控制器如何使用IsValid屬性來驗證命令。請記住,這個示例使用的是命令的一個實例作為模型。

[HttpPost] public ActionResult SpecifyRegistrantDetails(string conferenceCode, Guid orderId, AssignRegistrantDetails command) {if (!ModelState.IsValid){return SpecifyRegistrantDetails(conferenceCode, orderId);}this.commandBus.Send(command);return RedirectToAction("SpecifyPaymentDetails", new { conferenceCode = conferenceCode, orderId = orderId }); }

有關其他示例,請參見RegistrationController類中的RegisterToConference命令和StartRegistration action方法。

更多信息,請參考MSDN上的Models and Validation in ASP.NET MVC 。

推送更新到讀端

關于訂單的一些信息只需要存在于讀取端。特別是,關于部分已完成訂單的信息只在UI中使用,而不是寫端領域模型保存的業務信息的一部分。

這意味著系統不能使用SQL視圖作為讀取端上的底層存儲機制,因為視圖不包含它們所基于的表中不存在的數據。

系統將非規范化的訂單數據存儲在SQL數據庫實例中的兩個表中:OrdersView和OrderItemsView表。OrderItemsView表包含RequestedSeats列,該列包含僅存在于讀取端上的數據。

OrdersView表

  • OrderId --> Order的唯一ID
  • ReservationExpirationDate --> 預訂座位的過期時間
  • StateValue --> 訂單的狀態,包括:Created, PartiallyReserved, ReservationCompleted, Rejected, Confirmed
  • RegistrantEmail --> 預訂時填寫的Email地址
  • AccessCode --> 訂單的訪問碼

OrderItemsView

  • OrderItemId --> 訂單項的唯一ID
  • SeatType --> 預訂的座位類型
  • RequestedSeats --> 請求預訂座位的數量
  • ReservedSeats --> 預留座位的數量
  • OrderId --> 關聯的父Order的ID

要將這些表填充到讀模型中,讀端需要處理由寫端引發的事件,用它們對這些表進行寫操作。有關詳細信息,請參見上面章節中的架構圖。

OrderViewModelGenerator類處理這些事件并更新讀端存儲庫。

public class OrderViewModelGenerator :IEventHandler<OrderPlaced>, IEventHandler<OrderUpdated>,IEventHandler<OrderPartiallyReserved>, IEventHandler<OrderReservationCompleted>,IEventHandler<OrderRegistrantAssigned> {private readonly Func<ConferenceRegistrationDbContext> contextFactory;public OrderViewModelGenerator(Func<ConferenceRegistrationDbContext> contextFactory){this.contextFactory = contextFactory;}public void Handle(OrderPlaced @event){using (var context = this.contextFactory.Invoke()){var dto = new DraftOrder(@event.SourceId, DraftOrder.States.Created){AccessCode = @event.AccessCode,};dto.Lines.AddRange(@event.Seats.Select(seat => new DraftOrderItem(seat.SeatType, seat.Quantity)));context.Save(dto);}}public void Handle(OrderRegistrantAssigned @event){...}public void Handle(OrderUpdated @event){...}public void Handle(OrderPartiallyReserved @event){...}public void Handle(OrderReservationCompleted @event){...}... }

下面的代碼示例展示ConferenceRegistrationDbContext類:

public class ConferenceRegistrationDbContext : DbContext {...public T Find<T>(Guid id) where T : class{return this.Set<T>().Find(id);}public IQueryable<T> Query<T>() where T : class{return this.Set<T>();}public void Save<T>(T entity) where T : class{var entry = this.Entry(entity);if (entry.State == System.Data.EntityState.Detached)this.Set<T>().Add(entity);this.SaveChanges();} } Jana(軟件架構師)發言:
注意,讀端中的這個ConferenceRegistrationDbContext類包含一個Save方法,以保存從寫端發送的更改,并通過OrderViewModelGenerator類來調用。

在讀端查詢

下面的代碼示例顯示了一個非通用的DAO類,MVC控制器使用該類在讀端查詢會議信息。它封裝了前面展示的ConferenceRegistrationDbContext類。

public class ConferenceDao : IConferenceDao {private readonly Func<ConferenceRegistrationDbContext> contextFactory;public ConferenceDao(Func<ConferenceRegistrationDbContext> contextFactory){this.contextFactory = contextFactory;}public ConferenceDetails GetConferenceDetails(string conferenceCode){using (var context = this.contextFactory.Invoke()){return context.Query<Conference>().Where(dto => dto.Code == conferenceCode).Select(x => new ConferenceDetails { Id = x.Id, Code = x.Code, Name = x.Name, Description = x.Description, StartDate = x.StartDate }).FirstOrDefault();}}public ConferenceAlias GetConferenceAlias(string conferenceCode){...}public IList<SeatType> GetPublishedSeatTypes(Guid conferenceId){...} } Jana(軟件架構師)發言:
注意,這個ConferenceDao類只包含返回數據的方法。MVC控制器使用它來檢索要在UI中顯示的數據。

重構可用座位(SeatsAvailability)聚合

在我們CQRS之旅的第一階段,領域包含一個ConferenceSeatsAvailabilty聚合根類,這是對會議剩余座位數量進行的建模。在旅程的現在這個階段,團隊將ConferenceSeatsAvailabilty聚合替換為SeatsAvailability,以反映特定會議可能有多種座位類型。例如,完整會議的席位、會前研討會的席位和雞尾酒會的席位。下圖顯示了新的SeatsAvailability聚合及其組成類。

這個聚合反應了下面兩個模型:

  • 一個會議可能有多種座位類型。
  • 每個座位類型可能有不同的座位數量。

領域現在包括一個SeatQuantity值類型,您可以使用它來表示特定座椅類型的數量。

之前,聚合會根據是否有足夠的座位數量來引發ReservationAccepted或ReservationRejected事件,現在,聚合引發一個SeatsReserved事件,該事件報告它可以預訂多少個特定類型的座位。這意味著預留的座位數目可能與所要求的座位數目不相符。此信息被傳遞回UI,以便注冊者決定如何繼續預訂。

AddSeats方法

您可能在最上面的架構圖中注意到,SeatsAvailability聚合包含一個AddSeats方法,但沒有相應的命令。AddSeats方法調整給定類型的可用座位總數。業務客戶負責進行任何此類調整,并在Conference Management限界上下文中進行。當可用座位總數發生更改時,Conference Management限界上下文將引發事件。然后,SeatsAvailability類在其處理程序中調用AddSeat方法來處理事件。

對測試的影響

本節將討論在現在這個階段解決的一些測試問題。

驗收測試和領域專家

在第3章“訂單和注冊限界上下文”中,您看到了一些UI原型,開發人員和領域專家一起工作,以改進系統的一些功能需求。這些UI原型的計劃用途之一是為系統形成一組驗收測試的基礎。

對于驗收測試方法,團隊有以下目標:

  • 驗收測試應該以領域專家能夠理解的格式清楚地表達出來。
  • 應該可以自動執行驗收測試。

為了實現這些目標,領域專家與測試團隊的成員配對,并使用SpecFlow來指定核心驗收測試。

使用SpecFlow feature來定義驗收測試

使用SpecFlow定義驗收測試的第一步是使用SpecFlow notation。這些測試被保存為feature文件在一個Visual Studio項目中。以下代碼示例來自于ConferenceConfiguration.feature文件,該文件在FeaturesUserInterfaceViewsManagement文件夾下。它顯示了Conference Management限界上下文的驗收測試。典型的SpecFlow測試場景由一組Given、When和Then語句組成。其中一些語句包含測試使用的數據。

Markus(軟件開發人員)發言:
事實上,SpecFlow feature文件使用Gherkin語言,這是一種專門為行為描述創建的領域特定語言(DSL)。Feature: Conference configuration scenarios for creating and editing Conference settingsIn order to create or update a Conference configurationAs a Business CustomerI want to be able to create or update a Conference and set its propertiesBackground: Given the Business Customer selected the Create Conference optionScenario: An existing unpublished Conference is selected and published Given this conference information | Owner | Email | Name | Description | Slug | Start | End | | William Flash | william@fabrikam.com | CQRS2012P | CQRS summit 2012 conference (Published) | random | 05/02/2012 | 05/12/2012 | And the Business Customer proceeds to create the Conference When the Business Customer proceeds to publish the Conference Then the state of the Conference changes to PublishedScenario: An existing Conference is edited and updated Given an existing published conference with this information | Owner | Email | Name | Description | Slug | Start | End | | William Flash | william@fabrikam.com | CQRS2012U | CQRS summit 2012 conference (Original) | random | 05/02/2012 | 05/12/2012 | And the Business Customer proceeds to edit the existing settings with this information | Description | | CQRS summit 2012 conference (Updated) | When the Business Customer proceeds to save the changes Then this information appears in the Conference settings | Description | | CQRS summit 2012 conference (Updated) |... Carlos(領域專家)發言:
我發現這些驗收測試是我向開發人員闡明系統預期行為定義的好方法。

有關其他示例,請參見源代碼里的Conference.AcceptanceTests解決方案

讓測試可執行

feature文件中的驗收測試不能直接執行。您必須提供一些管道代碼來連接SpecFlow feature文件和應用程序。

有關實現的示例,請參見源代碼Conference.AcceptanceTests解決方案下的Conference.Specflow項目下的Steps文件夾中的類。

這些步驟使用兩種不同的方法實現

第一種運行測試的方法是模擬系統的一個用戶,它通過使用第三方開源庫WatiN直接驅動web瀏覽器來實現。這種方法的優點是,它運行系統的方式和實際用戶與系統交互的的方式完全相同,并且最初實現起來很簡單。然而,這些測試是脆弱的,將需要大量的維護工作來保持它們在UI和系統更改后也會更新成最新的。下面的代碼示例展示了這種方法的一個示例,定義了前面所示的feature文件中的一些Given、When和Then步驟。SpecFlow使用Given、When和Then標記把步驟和feature文件中的子句鏈接起來,并把它當做參數值傳遞給測試方法:

public class ConferenceConfigurationSteps : StepDefinition {...[Given(@"the Business Customer proceeds to edit the existing settings with this information")]public void GivenTheBusinessCustomerProceedToEditTheExistingSettignsWithThisInformation(Table table){Browser.Click(Constants.UI.EditConferenceId);PopulateConferenceInformation(table);}[Given(@"an existing published conference with this information")]public void GivenAnExistingPublishedConferenceWithThisInformation(Table table){ExistingConferenceWithThisInformation(table, true);}private void ExistingConferenceWithThisInformation(Table table, bool publish){NavigateToCreateConferenceOption();PopulateConferenceInformation(table, true);CreateTheConference();if(publish) PublishTheConference();ScenarioContext.Current.Set(table.Rows[0]["Email"], Constants.EmailSessionKey);ScenarioContext.Current.Set(Browser.FindText(Slug.FindBy), Constants.AccessCodeSessionKey);}...[When(@"the Business Customer proceeds to save the changes")]public void WhenTheBusinessCustomerProceedToSaveTheChanges(){Browser.Click(Constants.UI.UpdateConferenceId);}...[Then(@"this information appears in the Conference settings")]public void ThenThisInformationIsShowUpInTheConferenceSettings(Table table){Assert.True(Browser.SafeContainsText(table.Rows[0][0]),string.Format("The following text was not found on the page: {0}", table.Rows[0][0]));}private void PublishTheConference(){Browser.Click(Constants.UI.PublishConferenceId);}private void CreateTheConference(){ScenarioContext.Current.Browser().Click(Constants.UI.CreateConferenceId);}private void NavigateToCreateConferenceOption(){// Navigate to Registration pageBrowser.GoTo(Constants.ConferenceManagementCreatePage);}private void PopulateConferenceInformation(Table table, bool create = false){var row = table.Rows[0];if (create){Browser.SetInput("OwnerName", row["Owner"]);Browser.SetInput("OwnerEmail", row["Email"]);Browser.SetInput("name", row["Email"], "ConfirmEmail");Browser.SetInput("Slug", Slug.CreateNew().Value);}Browser.SetInput("Tagline", Constants.UI.TagLine);Browser.SetInput("Location", Constants.UI.Location);Browser.SetInput("TwitterSearch", Constants.UI.TwitterSearch);if (row.ContainsKey("Name")) Browser.SetInput("Name", row["Name"]);if (row.ContainsKey("Description")) Browser.SetInput("Description", row["Description"]);if (row.ContainsKey("Start")) Browser.SetInput("StartDate", row["Start"]);if (row.ContainsKey("End")) Browser.SetInput("EndDate", row["End"]);} }

您可以看到這種方法是如何模擬在Web瀏覽器中點擊UI元素并輸入文本的。

第二種測試方法是通過與MVC控制器類交互來實現。長遠的看,這種方法不會那么脆弱,成本就是在最初需要一個更復雜的實現,這需要對系統的內部實現比較熟悉。下面的代碼示例展示了這種方法的一個示例。

首先,在FeaturesUserInterfaceControllersRegistration文件夾下的SelfRegistrationEndToEndWithControllers.feature文件展示了一個示例場景:

Scenario: End to end Registration implemented using controllersGiven the Registrant proceeds to make the ReservationAnd these Order Items should be reserved| seat type | quantity || General admission | 1 || Additional cocktail party | 1 |And these Order Items should not be reserved| seat type || CQRS Workshop |And the Registrant enters these details| first name | last name | email address || William | Flash | william@fabrikam.com |And the Registrant proceeds to Checkout:PaymentWhen the Registrant proceeds to confirm the paymentThen the Order should be created with the following Order Items| seat type | quantity || General admission | 1 || Additional cocktail party | 1 |And the Registrant assigns these seats| seat type | first name | last name | email address || General admission | William | Flash | William@fabrikam.com || Additional cocktail party | Jim | Corbin | Jim@litwareinc.com |And these seats are assigned| seat type | quantity || General admission | 1 || Additional cocktail party | 1 |

然后,展示了SelfRegistrationEndToEndWithControllersSteps類里的一些測試步驟:

[Given(@"the Registrant proceeds to make the Reservation")] public void GivenTheRegistrantProceedToMakeTheReservation() {var redirect = registrationController.StartRegistration(registration, registrationController.ViewBag.OrderVersion) as RedirectToRouteResult;Assert.NotNull(redirect);// Perform external redirectionvar timeout = DateTime.Now.Add(Constants.UI.WaitTimeout);while (DateTime.Now < timeout && registrationViewModel == null){//ReservationUnknownvar result = registrationController.SpecifyRegistrantAndPaymentDetails((Guid)redirect.RouteValues["orderId"], registrationController.ViewBag.OrderVersion);Assert.IsNotType<RedirectToRouteResult>(result);registrationViewModel = RegistrationHelper.GetModel<RegistrationViewModel>(result);}Assert.False(registrationViewModel == null, "Could not make the reservation and get the RegistrationViewModel"); }...[When(@"the Registrant proceeds to confirm the payment")] public void WhenTheRegistrantProceedToConfirmThePayment() {using (var paymentController = RegistrationHelper.GetPaymentController()){paymentController.ThirdPartyProcessorPaymentAccepted(conferenceInfo.Slug, (Guid) routeValues["paymentId"], " ");} }...[Then(@"the Order should be created with the following Order Items")] public void ThenTheOrderShouldBeCreatedWithTheFollowingOrderItems(Table table) {draftOrder = RegistrationHelper.GetModel<DraftOrder>(registrationController.ThankYou(registrationViewModel.Order.OrderId));Assert.NotNull(draftOrder);foreach (var row in table.Rows){var orderItem = draftOrder.Lines.FirstOrDefault(l => l.SeatType == conferenceInfo.Seats.First(s => s.Description == row["seat type"]).Id);Assert.NotNull(orderItem);Assert.Equal(Int32.Parse(row["quantity"]), orderItem.ReservedSeats);} }

您可以看到這種方法是如何直接使用RegistrationController類的。

在這些代碼示例中,您可以看到是怎樣通過標記把SpecFlow feature文件和測試步驟代碼鏈接起來并傳遞參數的。

團隊選擇使用xUnit.net來實現測試步驟,要在Visual Studio里運行這些測試,您可以使用任何支持xUnit的第三方工具例如:ReSharper, CodeRush, TestDriven.NET等。

Jana(軟件架構師)發言:
請記住,這些驗收測試并不是在系統上執行的唯一測試。主要的解決方案里包括全面的單元測試和集成測試,測試團隊還對應用程序進行了探索性和性能測試。

使用測試來幫助開發人員理解消息流

關于使用CQRS模式和大量使用消息,有一個常見說法是這讓人很難理解系統是如何通過發送和接收消息把各個不同的部分配合在一起的。這里您可以通過設計適當的單元測試來幫助別人理解您的基本代碼。

訂單聚合的第一個單元測試示例:

public class given_placed_order {...private Order sut;public given_placed_order(){this.sut = new Order(OrderId, new[] {new OrderPlaced { ConferenceId = ConferenceId,Seats = new[] { new SeatQuantity(SeatTypeId, 5) },ReservationAutoExpiration = DateTime.UtcNow}});}[Fact]public void when_updating_seats_then_updates_order_with_new_seats(){this.sut.UpdateSeats(new[] { new OrderItem(SeatTypeId, 20) });var @event = (OrderUpdated)sut.Events.Single();Assert.Equal(OrderId, @event.SourceId);Assert.Equal(1, @event.Seats.Count());Assert.Equal(20, @event.Seats.ElementAt(0).Quantity);}... }

這個單元測試只是創建一個Order實例,并直接調用UpdateSeats方法。它不向閱讀測試代碼的人提供有關調用此方法中命令或事件的任何信息。

現在看第二個示例,它執行的是相同的測試,但是在本示例中,是通過發送命令來測試的:

public class given_placed_order {...private EventSourcingTestHelper<Order> sut;public given_placed_order(){this.sut = new EventSourcingTestHelper<Order>();this.sut.Setup(new OrderCommandHandler(sut.Repository, pricingService.Object));this.sut.Given(new OrderPlaced { SourceId = OrderId,ConferenceId = ConferenceId,Seats = new[] { new SeatQuantity(SeatTypeId, 5) },ReservationAutoExpiration = DateTime.UtcNow});}[Fact]public void when_updating_seats_then_updates_order_with_new_seats(){this.sut.When(new RegisterToConference { ConferenceId = ConferenceId, OrderId = OrderId, Seats = new[] { new SeatQuantity(SeatTypeId, 20) }});var @event = sut.ThenHasSingle<OrderUpdated>();Assert.Equal(OrderId, @event.SourceId);Assert.Equal(1, @event.Seats.Count());Assert.Equal(20, @event.Seats.ElementAt(0).Quantity);}... }

這個例子使用了一個helper類,它使您能夠向Order實例發送命令。現在,閱讀測試的人可以明白,當您發送RegisterToConference命令時,您期望看到OrderUpdated事件。

代碼理解之旅

喬什·埃爾斯特講述了一個關于痛苦、解脫和學習的故事

本節描述CQRS咨詢委員會成員喬什·埃爾斯在探索Contoso會議管理系統的源代碼時所經歷的過程。

測試是很重要的

我曾經相信,優秀架構的應用程序很容易理解,不管代碼庫有多么龐大。每當我理解應用程序行為功能時遇到問題,都是代碼的問題,而不是我的問題。

永遠不要讓你的自負掩蓋住常識。

事實上,一直到我職業生涯的某個階段,我都還沒有接觸到一個大型的、架構優秀的代碼基本。如果不是它走過來打我的臉,我根本就不知道它是什么樣子。值得慶幸的是,隨著我閱讀代碼的經驗越來越豐富,我學會了區分那些不同。

備注:在任何結構良好的項目中,測試都是開發人員理解項目的基礎。各種命名約定,編碼風格,設計方法和使用模式的主題都包含在測試套件中,為集成到代碼庫提供了一個很好的起點。這也是很好的代碼專業性實踐,熟能生巧!

克隆會議代碼之后,我的第一個動作是瀏覽測試。在閱讀了會議系統Visual Studio解決方案中的集成和單元測試套件之后,我將注意力集中在Conference.AcceptanceTests Visual Studio解決方案上,其中包含SpecFlow驗收測試。項目團隊的其他成員已經對那些.feature文件做了一些初步的工作,由于我不熟悉業務規則的細節,所以對我來說效果很好。把這些feature和代碼綁定是一種很好的方式,既可以為項目做出貢獻,又可以讓人理解系統如何工作。

領域測試

當時我的目標是得到一個像這樣的feature文件:

Feature: Self Registrant scenarios for making a Reservation for a Conference site with all Order Items initially availableIn order to reserve Seats for a conferenceAs an AttendeeI want to be able to select an Order Item from one or many of the available Order Items and make a ReservationBackground: Given the list of the available Order Items for the CQRS Summit 2012 conference with the slug code SelfRegFull| seat type | rate | quota || General admission | $199 | 100 || CQRS Workshop | $500 | 100 || Additional cocktail party | $50 | 100 |And the selected Order Items| seat type | quantity || General admission | 1 || CQRS Workshop | 1 || Additional cocktail party | 1 |Scenario: All the Order Items are available and all get reservedWhen the Registrant proceeds to make the Reservation Then the Reservation is confirmed for all the selected Order ItemsAnd these Order Items should be reserved| seat type || General admission || CQRS Workshop || Additional cocktail party |And the total should read $749And the countdown started

并將其綁定到執行操作、創建期望或作出斷言的代碼:

[Given(@"the '(.*)' site conference")] public void GivenAConferenceNamed(string conference) {... }

所有這些都位于"UI之下",但是在基礎概念之上。測試緊密關注整個解決方案領域的行為,這就是為什么我將這些類型的測試稱為領域測試。其他術語,如行為驅動開發(BDD),可以用來描述這種類型的測試。

Jana(軟件架構師)發言:
這些“UI之下”測試也被稱為皮下測試(參見Meszaros, G。Melnik, G的Acceptance Test Engineering Guide)。

重寫一遍已經在網站上實現的應用程序邏輯似乎有點多余,但是有以下幾個原因值得花時間:

  • 您(由于某些原因)對網站或任何其他基礎設施部分的行為測試不感興趣。你只對領域有興趣,單元級和集成級的測試將驗證代碼的功能是否正確,因此不需要重復這些測試。
  • 當與產品所有者迭代用戶故事時,將時間花在純粹的UI關注點上會拖慢反饋周期,降低反饋的質量和有用性。
  • 考慮到不同的人在討論技術問題時使用的詞匯之間有時會出現很大的不匹配,用更抽象的術語討論一個功能可以更好的理解業務試圖解決的問題。
  • 在實現測試邏輯時遇到的障礙可以幫助提高系統的總體設計質量。基礎設施代碼與應用程序邏輯難以分離通常被視為一種壞味道。
備注:為什么這些類型的測試是一個好主意?還有更多的原因沒有列出來,但是對于本例來說,這里列出的是那些重要的原因。

Contoso會議管理系統的體系結構是松耦合的,利用消息將命令和事件傳遞給相關方。命令通過命令總線路由到單個處理程序,而事件則通過事件總線路由到它們的1個或多個處理程序。就消費應用程序而言,總線不綁定任何特定的技術,允許以對用戶透明的方式在整個系統中創建和使用任意的實現。

當涉及到松耦合消息體系結構的行為測試時,另一個好處是BDD(或類似風格的)測試本身不涉及應用程序代碼的內部工作。它們只關心被測試程序的可觀察行為。這意味著對于SpecFlow測試,我們只需要將一些命令發布到總線,并通過根據實際的流量/數據斷言預期的消息流量和有效負載來檢查外部結果。

備注:在適當的地方,可以使用mock和stub來進行這些類型的測試。一個適當的例子是使用mock出來的ICommandBus對象而不是真正的AzureCommandBus類型。但mock一個完整的領域服務是不合適的例子。盡量少的使用mock,只把它限制在基礎設施方面,這樣你的生活和測試壓力都會小很多。

另一種情況

我剛剛花費了很多來描述事情是多么的棒和簡單,哪里有痛苦呢?痛苦在于理解一個系統中發生了什么。松耦合的體系結構也有不好的一面:控制反轉和依賴注入等技術從本質上阻礙了代碼的可讀性,因為如果不仔細檢查容器的初始化,就永遠無法確定在特定的點注入了什么具體的類。在journey的代碼中,IProcess接口是一種表示長時間運行的業務流程(也稱為Sagas或流程管理器)的類,這些類負責協調不同聚合之間的業務邏輯。為了維護系統數據和狀態的完整性、冪等性和事務性,它發出的命令的實際發送是各個持久化倉儲來實現的。由于控制反轉和依賴注入對消費者隱藏了這些類型的詳細信息,所以它和系統的一些其他屬性會造成一點困難在回答一些表面上瑣碎的問題時,比如:

  • 誰會發出或已發出了特定的命令或事件?
  • 什么樣的類處理特定的命令或事件?
  • 流程或聚合在哪里創建或持久化?
  • 什么時候發出與其他命令或事件相關的命令?
  • 為什么系統會這樣運行?
  • 應用程序的狀態如何由特定的命令改變?

由于應用程序的依賴關系非常松散,許多傳統的代碼分析工具和方法要么變得不那么有用,要么完全沒用。

讓我們以RegistrationProcessManager作為示例,列出一些涉及到回答這些問題的啟發式內容。

  • 打開RegistrationProcessManager.cs文件,注意,與許多流程管理器一樣,它有一個ProcessState枚舉。我們注意進程的開始狀態:NotStarted。接下來,我們要找到做下面事情之一的代碼:
    • 創建流程的新實例(流程在哪里創建或持久化?)
    • 初始狀態被更改為不同的狀態(狀態如何更改?)
  • 找到源代碼中出現上述任何一種情況或同時出現上述兩種情況的代碼位置。在本例中,它是RegistrationProcessManagerRouter類中的Handle方法。重要提示:這并不一定意味著該流程是一個命令處理程序!流程管理器負責從存儲中創建和檢索聚合根(AR),以便將消息路由到AR,因此盡管它們的方法在名稱和簽名上與ICommandHandler實現類似,但它們并不實現處理命令的邏輯。
  • 請注意當狀態發生變化時接收到的消息類型是作為方法參數被傳入的,因此我們現在需要找出消息的來源。
    • 我們還將注意到,RegistrationProcessManager發出了一個新的命令:MakeSeatReservation。
    • 如上所述,這個命令實際上不是由發出它的進程發出的,相反,是當進程保存到磁盤時,才會發出。
    • 對于其他任何作為進程處理命令的副作用的,被發出的命令,需要一定程度的重復這些啟發。
  • 查找OrderPlaced的引用,找到一個或多個頂部(外部)組件,這些組件通過ICommandBus接口上的Send方法發出該類型的消息。
    • 由于內部發出的命令是在倉儲的Save方法里,所以可以安全地假設直接調用Send方法的任何非基礎設施邏輯都是外部入口點。

    雖然啟發式的內容肯定比這里所提到的要多,但是這里的這些內容很可能足夠證明了。即使討論交互也是一個相當漫長、繁瑣的過程。這很容易造成誤解。您可以通過這種方式理解各種命令/事件消息傳遞交互,但是這種方式不是很有效。

    備注:一般來說,一個人在任何時候都只能在腦子里保持四到八個不同的想法。為了說明這一概念,讓我們保守地計算一下你需要在短期記憶中同時保持的東西的數量,同時遵循上面的啟發: 進程類型+進程狀態屬性+初始狀態(NotStarted) + new()的位置+消息類型+中間路由類類型+ 2 *N^ N命令發出(位置、類型、步驟)+判別規則(邏輯也是數據!) > 8

    當基礎設施需求混合到等式中時,信息飽和的問題會變得更加明顯。作為我們都是有能力的開發人員(對吧?),我們可以開始尋找方法來優化這些步驟,并提高相關信息的信噪比。

    總之,我們有兩個問題:

    • 我們被迫記在腦子里的東西太多,無法有效理解。
    • 用于消息傳遞交互的討論和文檔冗長、容易出錯且復雜。

    幸運的是,使用MIL(消息傳遞中間語言)可以一舉兩得。

    MIL一開始是一系列LINQPad腳本和代碼片段,我創建這些腳本和代碼片段是為了在回答問題時幫助處理所有事情。最初,這些腳本完成的所有工作都是通過一個或多個項目程序集反映并輸出各種類型的消息和處理程序。在與團隊成員的討論中,很明顯其他人也遇到了與我相同的問題。在與模式和實踐團隊成員進行了幾次聊天和頭腦風暴會議之后,我們提出了引入一種小型領域特定語言(DSL)的想法,該語言將封裝所討論的交互。暫時命名為SawMIL toolbox,它位于http://jelster.github.com/CqrsMessagingTools/,它提供了實用工具、腳本和示例,使您能夠將MIL用作開發和分析流程管理器的一部分。

    在MIL中,消息傳遞組件和交互以特定的方式表示:命令(因為它們是系統執行某些操作的請求)用?表示,比如DoSomething?。事件表示系統中發生的確定的事情,因此獲得一個!后綴,如SomethingHappened!

    MIL的另一個重要元素是消息發布和接收。從消息源(如Azure服務總線、NServiceBus等)接收的消息總是在前面加上“->”符號,為了讓示例暫時保持簡單,有一個可選的nil元素(句號.)。用于顯式地指示no-op(換句話說,沒有接收到任何消息)。下面的代碼片段展示了nil元素語法的一個例子:

    SendCustomerInvoice? -> . CustomerInvoiceSent! -> .

    一旦發布了命令或事件,就需要對其進行處理。命令只有一個處理程序,而事件可以有多個處理程序。MIL通過將處理程序的名稱放在消息傳遞操作的另一側來表示消息與處理程序之間的這種關系,如下面的代碼片段所示:

    SendCustomerInvoice? -> CustomerInvoiceHandler CustomerInvoiceSent! ->-> CustomerNotificationHandler-> AccountsAgeingViewModelGenerator

    注意,命令和命令處理程序位于同一行,是因為命令和命令處理程序是1對1的。事件因為可能有多個事件處理程序,所以把他們放到多行上。

    聚合根以@符號作為前綴,使用過twitter的人都會很熟悉它。聚合根從不處理命令,但偶爾可能處理事件。聚合根是最常見的事件源,它引發事件以響應在聚合上調用的業務操作。但是,關于這些事件應該清楚的一點是,在大多數系統中,有其他元素決定并實際執行領域事件的發布。這是一個有趣的案例,其中業務和技術需求模糊了邊界,由基礎設施邏輯而不是應用程序或業務邏輯來滿足需求。旅程代碼就是一個例子:為了確保事件源和事件訂閱者之間的一致性,持久化聚合根的存儲庫的實現才是負責將事件實際發布到總線的。下面的代碼片段顯示了AggregateRoot語法的一個示例:

    SendCustomerInvoice? -> CustomerInvoiceHandler @Invoice::CustomerInvoiceSent! -> .

    在上面的示例中,一個名為Scope上下文操作符的新語言元素出現在@AggregateRoot旁邊。范圍上下文元素由雙冒號(::)表示,它的兩個字符之間可能有空格,也可能沒有空格,用于標識兩個對象之間的關系。上面,聚合根 '@Invoice'生成CustomerSent!事件來響應CustomerInvoiceHandler調用的邏輯。下一個例子演示了在聚合根上使用Scope元素,它生成多個事件來響應單個命令:

    SendCustomerInvoice? -> CustomerInvoiceHandler @Invoice::CustomerInvoiceSent! -> .:InvoiceAged! -> .

    Scope上下文還用于表示不涉及基礎設施消息傳遞設備的元素內路由:

    SendCustomerInvoice? -> CustomerInvoiceHandler @Invoice::CustomerInvoiceSent! ->-> InvoiceAgeingProcessRouter::InvoiceAgeingProcess

    我將介紹的最后一個元素是State Change。狀態變化是跟蹤系統中發生的事情的最好方法之一,因此MIL將它們視為一等公民。這些語句必須出現在它們自己的文本行中,并以“*”字符作為前綴。這是MIL中唯一一次提到或出現任務,因為它非常重要!下面的代碼片段顯示了State Change元素的一個例子:

    SendCustomerInvoice? -> CustomerInvoiceHandler @Invoice::CustomerInvoiceSent! ->-> InvoiceAgegingProcessRouter::InvoiceAgeingProcess*InvoiceAgeingProcess.ProcessState = Unpaid

    總結

    我們剛剛介紹了在松耦合應用程序中描述消息傳遞交互時使用的基本步驟。盡管所描述的交互只是可能交互的子集,但是MIL正在發展成為一種簡潔地描述基于消息的系統交互的方法。不同的名詞和動詞(元素和動作)由不同的、有記憶意義的符號表示。這提供了一種跨基板(粘糊糊的人腦< - >硅CPU)的方法來通信有關整個系統的有意義的信息。盡管該語言很好地描述了某些類型的消息傳遞交互,但它仍然是一項正在進行的工作,需要開發或改進該語言的許多元素和工具。這提供了一些很好的機會去為OSS貢獻代碼,如果你一直在觀望或思考參與OSS去貢獻代碼,沒有時間猶豫了,現在就去http://jelster.github.com/CqrsMessagingTools/,fork倉庫,馬上開始吧!

    總結

    以上是生活随笔為你收集整理的上下伸缩代码_CQRS之旅——旅程4(扩展和增强订单和注册限界上下文)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    福利一区二区三区视频在线观看 | 荡女精品导航 | 亚洲熟悉妇女xxx妇女av | 99国产欧美久久久精品 | 樱花草在线播放免费中文 | 狠狠色噜噜狠狠狠狠7777米奇 | 精品久久8x国产免费观看 | 人人超人人超碰超国产 | 亚洲精品国产第一综合99久久 | 中文字幕人妻无码一区二区三区 | 精品久久久久香蕉网 | 亚洲乱码中文字幕在线 | 激情五月综合色婷婷一区二区 | 亚洲熟妇自偷自拍另类 | 中文字幕无码av波多野吉衣 | 久久精品人妻少妇一区二区三区 | 女人被爽到呻吟gif动态图视看 | 欧美性生交活xxxxxdddd | 一本久久a久久精品vr综合 | 人人妻人人澡人人爽精品欧美 | 国精品人妻无码一区二区三区蜜柚 | 久久国产劲爆∧v内射 | 婷婷丁香六月激情综合啪 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲中文字幕av在天堂 | 女人和拘做爰正片视频 | 丰满妇女强制高潮18xxxx | 小鲜肉自慰网站xnxx | 亚洲成a人一区二区三区 | 在线播放免费人成毛片乱码 | 97精品人妻一区二区三区香蕉 | 99久久婷婷国产综合精品青草免费 | 国产色xx群视频射精 | 色五月丁香五月综合五月 | 小sao货水好多真紧h无码视频 | 日日躁夜夜躁狠狠躁 | 亚洲高清偷拍一区二区三区 | 伊人久久大香线蕉午夜 | 日韩少妇内射免费播放 | 熟妇人妻无码xxx视频 | 老熟妇仑乱视频一区二区 | 狂野欧美性猛xxxx乱大交 | 久久亚洲日韩精品一区二区三区 | 男人扒开女人内裤强吻桶进去 | 永久免费观看美女裸体的网站 | 久久天天躁夜夜躁狠狠 | 国产成人无码av片在线观看不卡 | 国产国产精品人在线视 | 久久人妻内射无码一区三区 | 乱码午夜-极国产极内射 | 亚洲一区二区三区四区 | 少妇被黑人到高潮喷出白浆 | 国产超碰人人爽人人做人人添 | 天下第一社区视频www日本 | √天堂中文官网8在线 | 成人影院yy111111在线观看 | 免费中文字幕日韩欧美 | 成人一在线视频日韩国产 | 国产一区二区三区四区五区加勒比 | 麻豆国产97在线 | 欧洲 | 国产精品久久国产三级国 | 欧美日韩亚洲国产精品 | 撕开奶罩揉吮奶头视频 | 亚洲欧美综合区丁香五月小说 | 久久午夜夜伦鲁鲁片无码免费 | 国产精品无套呻吟在线 | 日本熟妇大屁股人妻 | 成人性做爰aaa片免费看 | 国产av无码专区亚洲awww | 蜜桃av抽搐高潮一区二区 | 俄罗斯老熟妇色xxxx | 国产香蕉尹人综合在线观看 | 国产精品对白交换视频 | 亚洲啪av永久无码精品放毛片 | 日本饥渴人妻欲求不满 | 人人澡人摸人人添 | 精品国产av色一区二区深夜久久 | 乱人伦人妻中文字幕无码久久网 | 成年美女黄网站色大免费全看 | 亚洲精品国产第一综合99久久 | 国产人妖乱国产精品人妖 | 久久精品国产一区二区三区肥胖 | 天天摸天天透天天添 | 一本久道久久综合婷婷五月 | 少妇无码一区二区二三区 | 亚洲自偷自偷在线制服 | 亚洲理论电影在线观看 | 日本护士毛茸茸高潮 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 午夜福利试看120秒体验区 | 国产精品a成v人在线播放 | 国色天香社区在线视频 | 老子影院午夜精品无码 | 妺妺窝人体色www婷婷 | 粉嫩少妇内射浓精videos | 国产精品人人妻人人爽 | 麻豆果冻传媒2021精品传媒一区下载 | 色诱久久久久综合网ywww | 无码午夜成人1000部免费视频 | 国产精品久久久久久久9999 | 3d动漫精品啪啪一区二区中 | 久久久久免费精品国产 | 欧美freesex黑人又粗又大 | 黑人玩弄人妻中文在线 | 欧美一区二区三区视频在线观看 | 最新国产乱人伦偷精品免费网站 | 色婷婷久久一区二区三区麻豆 | 成人免费无码大片a毛片 | 精品国产成人一区二区三区 | 日本熟妇大屁股人妻 | 又大又硬又黄的免费视频 | aa片在线观看视频在线播放 | 亚洲欧洲中文日韩av乱码 | 国产超级va在线观看视频 | 亚洲欧美日韩国产精品一区二区 | 中文字幕人妻丝袜二区 | 国产高清不卡无码视频 | 中文字幕乱码人妻二区三区 | 亚洲第一无码av无码专区 | 久久精品女人天堂av免费观看 | 捆绑白丝粉色jk震动捧喷白浆 | 国产精品嫩草久久久久 | 色婷婷av一区二区三区之红樱桃 | 国産精品久久久久久久 | 久久zyz资源站无码中文动漫 | 国产色视频一区二区三区 | 国产精品无码mv在线观看 | 中文字幕无码免费久久99 | 狠狠色欧美亚洲狠狠色www | 妺妺窝人体色www婷婷 | 伊人久久婷婷五月综合97色 | 欧美放荡的少妇 | 骚片av蜜桃精品一区 | 最新版天堂资源中文官网 | 无码纯肉视频在线观看 | 中文字幕无码视频专区 | 99久久精品日本一区二区免费 | 综合人妻久久一区二区精品 | 97久久精品无码一区二区 | 综合人妻久久一区二区精品 | 亚洲精品午夜国产va久久成人 | 波多野结衣高清一区二区三区 | 天堂亚洲2017在线观看 | 一个人看的视频www在线 | 亚洲综合无码久久精品综合 | 少妇性l交大片欧洲热妇乱xxx | 三级4级全黄60分钟 | 日韩精品成人一区二区三区 | 99久久精品无码一区二区毛片 | 人妻互换免费中文字幕 | 国产va免费精品观看 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 野外少妇愉情中文字幕 | 国产激情无码一区二区app | 国精产品一品二品国精品69xx | 亚洲狠狠婷婷综合久久 | 免费无码午夜福利片69 | 色老头在线一区二区三区 | √8天堂资源地址中文在线 | 樱花草在线播放免费中文 | 亚洲熟妇色xxxxx欧美老妇 | 国产人成高清在线视频99最全资源 | 国产亚洲精品久久久久久国模美 | 久久精品国产亚洲精品 | 国产精品久久久久7777 | 天天摸天天透天天添 | 亚洲国产av精品一区二区蜜芽 | 日韩精品a片一区二区三区妖精 | 亚洲国产欧美日韩精品一区二区三区 | 麻豆国产丝袜白领秘书在线观看 | 国产人妻精品一区二区三区不卡 | 中文字幕久久久久人妻 | 亚洲自偷自偷在线制服 | 国产福利视频一区二区 | 国产手机在线αⅴ片无码观看 | 亚洲国产av精品一区二区蜜芽 | 对白脏话肉麻粗话av | 99精品无人区乱码1区2区3区 | 久久无码中文字幕免费影院蜜桃 | 2019午夜福利不卡片在线 | 久久久精品成人免费观看 | a在线亚洲男人的天堂 | 麻豆精品国产精华精华液好用吗 | 国产综合色产在线精品 | 欧美熟妇另类久久久久久多毛 | 日本一卡2卡3卡四卡精品网站 | 97无码免费人妻超级碰碰夜夜 | 俄罗斯老熟妇色xxxx | 黑人粗大猛烈进出高潮视频 | 最新国产麻豆aⅴ精品无码 | 伊人久久婷婷五月综合97色 | 国产两女互慰高潮视频在线观看 | 成人免费无码大片a毛片 | 在线精品国产一区二区三区 | 亚洲成av人片天堂网无码】 | 天天摸天天碰天天添 | 久久久久久久女国产乱让韩 | 国产精品亚洲а∨无码播放麻豆 | 成人性做爰aaa片免费看不忠 | 狠狠cao日日穞夜夜穞av | 樱花草在线社区www | 久久久久亚洲精品中文字幕 | 久久久精品456亚洲影院 | 久久午夜无码鲁丝片午夜精品 | 国产成人无码午夜视频在线观看 | 亚洲国产欧美在线成人 | 国产亚av手机在线观看 | 亚洲日韩一区二区三区 | 一本久久伊人热热精品中文字幕 | 亚洲区小说区激情区图片区 | 欧美真人作爱免费视频 | 午夜熟女插插xx免费视频 | 性欧美videos高清精品 | 又色又爽又黄的美女裸体网站 | 麻豆人妻少妇精品无码专区 | 巨爆乳无码视频在线观看 | 久久久久亚洲精品男人的天堂 | 久久久久久a亚洲欧洲av冫 | 久久精品女人的天堂av | 亚洲精品久久久久久一区二区 | 日韩无套无码精品 | 亚洲男人av天堂午夜在 | 无人区乱码一区二区三区 | 特大黑人娇小亚洲女 | 久久久久久国产精品无码下载 | 黑人玩弄人妻中文在线 | 国产熟妇另类久久久久 | 兔费看少妇性l交大片免费 | 久久久精品成人免费观看 | 正在播放老肥熟妇露脸 | 又紧又大又爽精品一区二区 | 欧美黑人性暴力猛交喷水 | 久久99精品国产.久久久久 | 强伦人妻一区二区三区视频18 | 丰满人妻被黑人猛烈进入 | √天堂中文官网8在线 | 欧洲极品少妇 | 日韩视频 中文字幕 视频一区 | 亚洲欧美精品伊人久久 | 人妻尝试又大又粗久久 | 日日摸天天摸爽爽狠狠97 | 女人被爽到呻吟gif动态图视看 | 午夜福利不卡在线视频 | 人妻无码αv中文字幕久久琪琪布 | 久久99精品久久久久久动态图 | 国产成人精品无码播放 | 人人妻人人澡人人爽欧美一区九九 | 人妻插b视频一区二区三区 | 国产精品资源一区二区 | 天堂а√在线中文在线 | 亚洲狠狠色丁香婷婷综合 | 色一情一乱一伦一视频免费看 | 少妇性俱乐部纵欲狂欢电影 | 国产精品国产三级国产专播 | 国产人妻久久精品二区三区老狼 | 国产综合色产在线精品 | 两性色午夜视频免费播放 | 99精品视频在线观看免费 | 久久熟妇人妻午夜寂寞影院 | 人人澡人人妻人人爽人人蜜桃 | 亚洲精品综合一区二区三区在线 | 18禁止看的免费污网站 | 又粗又大又硬又长又爽 | 18精品久久久无码午夜福利 | 一本色道婷婷久久欧美 | 午夜福利一区二区三区在线观看 | 国产97人人超碰caoprom | 国产精品毛片一区二区 | 亚洲国产精品美女久久久久 | 老熟妇仑乱视频一区二区 | 国产后入清纯学生妹 | 欧洲精品码一区二区三区免费看 | 99国产精品白浆在线观看免费 | 人人妻在人人 | 性欧美videos高清精品 | 爆乳一区二区三区无码 | 精品午夜福利在线观看 | 久久人人爽人人爽人人片av高清 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 国产成人精品必看 | 一本久道久久综合婷婷五月 | 国产电影无码午夜在线播放 | 无遮无挡爽爽免费视频 | 亚洲日本va午夜在线电影 | 在线欧美精品一区二区三区 | 欧美人妻一区二区三区 | 国产黑色丝袜在线播放 | 国产精品.xx视频.xxtv | 天天摸天天碰天天添 | 亚洲日韩中文字幕在线播放 | 激情综合激情五月俺也去 | 日产精品高潮呻吟av久久 | 少妇人妻偷人精品无码视频 | 成人三级无码视频在线观看 | 日本护士xxxxhd少妇 | 成在人线av无码免观看麻豆 | 国产精品沙发午睡系列 | 国产欧美熟妇另类久久久 | 亚洲中文字幕无码一久久区 | 欧洲vodafone精品性 | 男女猛烈xx00免费视频试看 | 亚洲第一无码av无码专区 | 一二三四社区在线中文视频 | 久久无码中文字幕免费影院蜜桃 | 天天摸天天碰天天添 | 中文精品无码中文字幕无码专区 | 国产九九九九九九九a片 | 国产卡一卡二卡三 | 少妇被黑人到高潮喷出白浆 | 鲁大师影院在线观看 | 永久免费精品精品永久-夜色 | 国产超级va在线观看视频 | 无码纯肉视频在线观看 | 鲁一鲁av2019在线 | 亚洲综合无码久久精品综合 | 亚洲国产精品无码一区二区三区 | 亚洲精品欧美二区三区中文字幕 | 日日碰狠狠躁久久躁蜜桃 | 色综合久久网 | 麻豆精品国产精华精华液好用吗 | 麻豆国产人妻欲求不满 | 亚洲欧洲日本综合aⅴ在线 | 亚洲 另类 在线 欧美 制服 | 亚洲成a人片在线观看无码 | 国产精品久久久久影院嫩草 | 欧美老人巨大xxxx做受 | 中文精品久久久久人妻不卡 | 天堂在线观看www | 日本欧美一区二区三区乱码 | 久久精品人妻少妇一区二区三区 | 亚洲精品综合一区二区三区在线 | 撕开奶罩揉吮奶头视频 | 中文亚洲成a人片在线观看 | 国产人妻久久精品二区三区老狼 | 国产女主播喷水视频在线观看 | 老熟妇仑乱视频一区二区 | 免费观看又污又黄的网站 | 一本久久a久久精品亚洲 | 国产精品欧美成人 | 亚洲国产欧美国产综合一区 | 无遮挡啪啪摇乳动态图 | a片免费视频在线观看 | 国产免费久久久久久无码 | 老头边吃奶边弄进去呻吟 | 亚洲欧洲中文日韩av乱码 | 乱人伦人妻中文字幕无码久久网 | 久久综合激激的五月天 | 亚洲乱码国产乱码精品精 | 午夜福利试看120秒体验区 | 国产亚洲美女精品久久久2020 | 色综合视频一区二区三区 | 两性色午夜免费视频 | 免费无码一区二区三区蜜桃大 | 国产午夜无码视频在线观看 | 国产成人无码av片在线观看不卡 | 无码人妻久久一区二区三区不卡 | 男人扒开女人内裤强吻桶进去 | 亚洲成av人在线观看网址 | 亚洲va中文字幕无码久久不卡 | 国产绳艺sm调教室论坛 | 日产国产精品亚洲系列 | 国产手机在线αⅴ片无码观看 | 老司机亚洲精品影院无码 | 青青草原综合久久大伊人精品 | 国精产品一区二区三区 | 九九热爱视频精品 | 成人无码精品一区二区三区 | 久久亚洲日韩精品一区二区三区 | 亚洲 高清 成人 动漫 | 奇米影视7777久久精品 | 久久精品人人做人人综合试看 | 欧美猛少妇色xxxxx | 男女猛烈xx00免费视频试看 | 99久久久国产精品无码免费 | 久久亚洲精品中文字幕无男同 | 日韩精品无码免费一区二区三区 | 一本加勒比波多野结衣 | 中文字幕无码热在线视频 | 狠狠色欧美亚洲狠狠色www | 老子影院午夜精品无码 | 国产性生交xxxxx无码 | 久久久成人毛片无码 | 动漫av一区二区在线观看 | 四十如虎的丰满熟妇啪啪 | 色一情一乱一伦一视频免费看 | 久久综合九色综合欧美狠狠 | 国产精品久久久久7777 | 国产凸凹视频一区二区 | 久久精品国产一区二区三区肥胖 | 日本在线高清不卡免费播放 | 影音先锋中文字幕无码 | 亚洲色大成网站www国产 | 无码午夜成人1000部免费视频 | 中文字幕av无码一区二区三区电影 | 亚洲精品成人福利网站 | 亚洲成a人片在线观看无码3d | 国产亲子乱弄免费视频 | 亚洲中文字幕va福利 | 98国产精品综合一区二区三区 | 亚洲国产av精品一区二区蜜芽 | 色欲人妻aaaaaaa无码 | 丝袜足控一区二区三区 | 一本大道伊人av久久综合 | 久久久久se色偷偷亚洲精品av | 色综合天天综合狠狠爱 | 亚洲欧美综合区丁香五月小说 | 国产成人无码a区在线观看视频app | 亚洲国产精品久久人人爱 | 久久综合激激的五月天 | 黑人大群体交免费视频 | 国产成人精品视频ⅴa片软件竹菊 | 东京无码熟妇人妻av在线网址 | 中文字幕 人妻熟女 | 免费网站看v片在线18禁无码 | 日本va欧美va欧美va精品 | 成人欧美一区二区三区 | 国产激情综合五月久久 | 无码人妻精品一区二区三区不卡 | 俺去俺来也在线www色官网 | ass日本丰满熟妇pics | 18无码粉嫩小泬无套在线观看 | 久久国产精品精品国产色婷婷 | 亚洲精品一区二区三区婷婷月 | 日韩精品一区二区av在线 | 大肉大捧一进一出视频出来呀 | 婷婷综合久久中文字幕蜜桃三电影 | 国产 精品 自在自线 | 精品国产成人一区二区三区 | 精品一二三区久久aaa片 | 国产极品视觉盛宴 | 欧美黑人性暴力猛交喷水 | 无码av免费一区二区三区试看 | 青草视频在线播放 | 黑人巨大精品欧美一区二区 | 国产av无码专区亚洲a∨毛片 | 成人无码影片精品久久久 | 亚洲色偷偷男人的天堂 | 爆乳一区二区三区无码 | 精品夜夜澡人妻无码av蜜桃 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲va中文字幕无码久久不卡 | 国产精品美女久久久网av | 久久精品丝袜高跟鞋 | 中文字幕日产无线码一区 | 一本色道婷婷久久欧美 | 熟妇女人妻丰满少妇中文字幕 | 国产内射爽爽大片视频社区在线 | 精品亚洲韩国一区二区三区 | 精品国产精品久久一区免费式 | 中文字幕日韩精品一区二区三区 | 色综合视频一区二区三区 | 国产精品香蕉在线观看 | 亚洲精品国偷拍自产在线麻豆 | 中文字幕乱码中文乱码51精品 | 国产精品高潮呻吟av久久4虎 | 欧美丰满熟妇xxxx | 亚洲自偷自偷在线制服 | 麻豆成人精品国产免费 | 亚洲精品中文字幕 | 狠狠噜狠狠狠狠丁香五月 | 国产精品久久久av久久久 | 日日夜夜撸啊撸 | 精品乱子伦一区二区三区 | 国产精品久久国产精品99 | 国产va免费精品观看 | 久久精品国产一区二区三区 | 成人性做爰aaa片免费看不忠 | 久久久久人妻一区精品色欧美 | 亚洲国产精品美女久久久久 | 精品一区二区三区波多野结衣 | 久久人人爽人人人人片 | 久久五月精品中文字幕 | 人妻少妇精品无码专区动漫 | 又粗又大又硬又长又爽 | 蜜桃视频韩日免费播放 | 欧美熟妇另类久久久久久不卡 | 精品无码一区二区三区的天堂 | 免费无码一区二区三区蜜桃大 | 色欲久久久天天天综合网精品 | 老子影院午夜精品无码 | 久热国产vs视频在线观看 | 久久人妻内射无码一区三区 | 久久 国产 尿 小便 嘘嘘 | 亚洲色欲色欲天天天www | 内射白嫩少妇超碰 | 成人无码精品一区二区三区 | 国产成人无码午夜视频在线观看 | 精品乱子伦一区二区三区 | 无套内谢老熟女 | 四虎4hu永久免费 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲日韩一区二区 | 18黄暴禁片在线观看 | 小sao货水好多真紧h无码视频 | 少妇久久久久久人妻无码 | 国产人妻精品一区二区三区 | 沈阳熟女露脸对白视频 | 日本精品少妇一区二区三区 | 国产做国产爱免费视频 | 老司机亚洲精品影院 | 无码人妻精品一区二区三区不卡 | 蜜桃无码一区二区三区 | 人人超人人超碰超国产 | 久久99精品久久久久久动态图 | 国产精品资源一区二区 | 久久午夜无码鲁丝片 | 纯爱无遮挡h肉动漫在线播放 | 在线播放无码字幕亚洲 | 真人与拘做受免费视频一 | 内射欧美老妇wbb | 男女超爽视频免费播放 | 影音先锋中文字幕无码 | 娇妻被黑人粗大高潮白浆 | 少妇高潮喷潮久久久影院 | 黑人大群体交免费视频 | 在线成人www免费观看视频 | 国产办公室秘书无码精品99 | 国产人妻人伦精品 | 国产人妻精品一区二区三区不卡 | 欧美老人巨大xxxx做受 | 欧美乱妇无乱码大黄a片 | 日本爽爽爽爽爽爽在线观看免 | 色情久久久av熟女人妻网站 | 久久亚洲中文字幕无码 | 国产av无码专区亚洲a∨毛片 | 国产人妻精品一区二区三区 | 东京一本一道一二三区 | 未满小14洗澡无码视频网站 | 精品无码一区二区三区爱欲 | 久久天天躁狠狠躁夜夜免费观看 | 青草青草久热国产精品 | 中文字幕+乱码+中文字幕一区 | 国产九九九九九九九a片 | 欧美熟妇另类久久久久久不卡 | 久久精品人人做人人综合试看 | 一本色道久久综合狠狠躁 | 欧美色就是色 | 露脸叫床粗话东北少妇 | 亚洲区小说区激情区图片区 | 乱码av麻豆丝袜熟女系列 | 国产精品无码久久av | 377p欧洲日本亚洲大胆 | 国精产品一区二区三区 | 亚洲性无码av中文字幕 | 色老头在线一区二区三区 | 国产激情综合五月久久 | 免费无码午夜福利片69 | 宝宝好涨水快流出来免费视频 | 装睡被陌生人摸出水好爽 | 人妻少妇精品视频专区 | 国产97在线 | 亚洲 | 国产九九九九九九九a片 | 亚洲欧美国产精品专区久久 | 精品亚洲成av人在线观看 | 亚洲国产精品一区二区美利坚 | 免费看男女做好爽好硬视频 | 99久久婷婷国产综合精品青草免费 | 国产在线精品一区二区高清不卡 | 日本丰满护士爆乳xxxx | 亚洲 另类 在线 欧美 制服 | 久久久久国色av免费观看性色 | 一个人看的www免费视频在线观看 | 日日碰狠狠丁香久燥 | 欧美成人家庭影院 | 亚洲成av人影院在线观看 | 狠狠躁日日躁夜夜躁2020 | 亚洲最大成人网站 | 国产一区二区三区精品视频 | 在线а√天堂中文官网 | 久久亚洲日韩精品一区二区三区 | 久久97精品久久久久久久不卡 | 娇妻被黑人粗大高潮白浆 | 午夜精品一区二区三区的区别 | 久久久精品成人免费观看 | 国产真实乱对白精彩久久 | 国产人妻人伦精品 | 狠狠色色综合网站 | 久久人妻内射无码一区三区 | 亚洲s色大片在线观看 | 久久久久亚洲精品中文字幕 | 国产亚洲欧美日韩亚洲中文色 | 久久天天躁夜夜躁狠狠 | 国产亚洲欧美日韩亚洲中文色 | 亚洲国产精品成人久久蜜臀 | 日本www一道久久久免费榴莲 | 国产精品-区区久久久狼 | 中文字幕av伊人av无码av | 国产美女极度色诱视频www | 久久精品成人欧美大片 | 黑森林福利视频导航 | 亚洲国产精品毛片av不卡在线 | 中文字幕+乱码+中文字幕一区 | 一本久久伊人热热精品中文字幕 | 国内精品人妻无码久久久影院蜜桃 | 狠狠噜狠狠狠狠丁香五月 | 午夜无码区在线观看 | 麻豆精品国产精华精华液好用吗 | 国产精品久久久久久无码 | 两性色午夜免费视频 | 日日橹狠狠爱欧美视频 | 成人女人看片免费视频放人 | 亚洲中文字幕久久无码 | 国产成人无码av片在线观看不卡 | 99麻豆久久久国产精品免费 | 亚洲精品一区二区三区在线 | 日韩人妻无码一区二区三区久久99 | 5858s亚洲色大成网站www | 精品一二三区久久aaa片 | 亚洲一区二区观看播放 | 国产免费观看黄av片 | 76少妇精品导航 | 国产成人综合色在线观看网站 | 亚洲精品一区三区三区在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲日韩一区二区三区 | 欧美日韩综合一区二区三区 | 中文字幕+乱码+中文字幕一区 | 中文无码成人免费视频在线观看 | 久激情内射婷内射蜜桃人妖 | 国产精品无码mv在线观看 | 国产高清不卡无码视频 | 久久人人爽人人人人片 | 久久国产精品萌白酱免费 | 九月婷婷人人澡人人添人人爽 | 亚洲欧美日韩综合久久久 | 亚洲欧洲无卡二区视頻 | 久久综合九色综合欧美狠狠 | 精品欧美一区二区三区久久久 | 亚洲日韩av片在线观看 | 一二三四在线观看免费视频 | 国产精品久久久久久久影院 | 亚洲综合另类小说色区 | 午夜福利试看120秒体验区 | 清纯唯美经典一区二区 | 国产精品无码一区二区三区不卡 | 亚洲精品中文字幕乱码 | 日产国产精品亚洲系列 | 一本加勒比波多野结衣 | 丰满岳乱妇在线观看中字无码 | 国产成人无码a区在线观看视频app | 日韩av无码一区二区三区不卡 | 在线播放亚洲第一字幕 | 野外少妇愉情中文字幕 | 综合激情五月综合激情五月激情1 | 国产人妻精品一区二区三区不卡 | 午夜福利一区二区三区在线观看 | 免费看男女做好爽好硬视频 | 免费国产黄网站在线观看 | 窝窝午夜理论片影院 | 国产va免费精品观看 | 亚洲热妇无码av在线播放 | 理论片87福利理论电影 | 中文字幕 亚洲精品 第1页 | 色综合久久网 | 久久婷婷五月综合色国产香蕉 | 国产小呦泬泬99精品 | 999久久久国产精品消防器材 | 久久久久久久人妻无码中文字幕爆 | 扒开双腿疯狂进出爽爽爽视频 | 久久久久久av无码免费看大片 | 亚洲精品国产精品乱码视色 | 对白脏话肉麻粗话av | 55夜色66夜色国产精品视频 | 成在人线av无码免观看麻豆 | 国产av人人夜夜澡人人爽麻豆 | 欧美老妇与禽交 | 国产亚洲欧美在线专区 | 国产亚洲日韩欧美另类第八页 | 51国偷自产一区二区三区 | 欧美日韩久久久精品a片 | 亚洲成a人片在线观看无码3d | 国产一区二区三区影院 | 香蕉久久久久久av成人 | 欧美日韩久久久精品a片 | 国产av无码专区亚洲a∨毛片 | 欧美日韩人成综合在线播放 | 丝袜足控一区二区三区 | 国产亚洲人成a在线v网站 | 55夜色66夜色国产精品视频 | 亚洲精品www久久久 | 夜夜高潮次次欢爽av女 | 亚洲欧洲无卡二区视頻 | 亚洲国产一区二区三区在线观看 | 国产精品亚洲一区二区三区喷水 | 牲欲强的熟妇农村老妇女 | 四虎影视成人永久免费观看视频 | 亚洲大尺度无码无码专区 | 久久综合九色综合欧美狠狠 | 麻豆成人精品国产免费 | 色偷偷人人澡人人爽人人模 | 午夜男女很黄的视频 | 老司机亚洲精品影院无码 | 日本va欧美va欧美va精品 | 欧美第一黄网免费网站 | 四虎国产精品一区二区 | 女人被男人爽到呻吟的视频 | 97色伦图片97综合影院 | 色一情一乱一伦一视频免费看 | 在线播放无码字幕亚洲 | 国产精品多人p群无码 | 国产亚洲人成a在线v网站 | 扒开双腿吃奶呻吟做受视频 | 精品久久综合1区2区3区激情 | 99精品久久毛片a片 | 午夜精品一区二区三区的区别 | 99久久久国产精品无码免费 | 中文字幕乱码人妻二区三区 | 欧美 日韩 亚洲 在线 | 日日摸日日碰夜夜爽av | 国产精品久久精品三级 | 台湾无码一区二区 | 兔费看少妇性l交大片免费 | 亚洲成色在线综合网站 | 亲嘴扒胸摸屁股激烈网站 | 老太婆性杂交欧美肥老太 | av无码久久久久不卡免费网站 | 国产成人精品久久亚洲高清不卡 | 久久99热只有频精品8 | 欧美成人免费全部网站 | 亚洲欧美国产精品专区久久 | 亚洲国产精华液网站w | 欧美第一黄网免费网站 | 天下第一社区视频www日本 | 久久精品国产99精品亚洲 | 2020久久超碰国产精品最新 | 亚洲中文字幕无码中字 | 亚洲狠狠色丁香婷婷综合 | 国产偷自视频区视频 | 国产特级毛片aaaaaa高潮流水 | 国产另类ts人妖一区二区 | 日本一本二本三区免费 | 丰满人妻被黑人猛烈进入 | 午夜无码区在线观看 | 久久精品视频在线看15 | 亚洲国产av美女网站 | 99久久人妻精品免费一区 | 青青青手机频在线观看 | 中文字幕日韩精品一区二区三区 | 无码毛片视频一区二区本码 | 图片区 小说区 区 亚洲五月 | 人人妻人人澡人人爽人人精品浪潮 | www国产亚洲精品久久网站 | 人人超人人超碰超国产 | 中文字幕乱码亚洲无线三区 | 性啪啪chinese东北女人 | 一本大道久久东京热无码av | 18禁止看的免费污网站 | 久久国产劲爆∧v内射 | av无码不卡在线观看免费 | 精品人妻人人做人人爽夜夜爽 | 精品少妇爆乳无码av无码专区 | 久久精品中文字幕一区 | 又大又黄又粗又爽的免费视频 | 色情久久久av熟女人妻网站 | 中文字幕日产无线码一区 | 日本护士xxxxhd少妇 | 中文字幕无码日韩专区 | 亚洲国产精品一区二区第一页 | 无码人妻少妇伦在线电影 | 精品人妻av区 | 国产熟妇高潮叫床视频播放 | 久久99精品久久久久久 | 亚洲一区二区三区无码久久 | 亚洲国产精品成人久久蜜臀 | 人妻有码中文字幕在线 | 人妻尝试又大又粗久久 | 国产国语老龄妇女a片 | 人妻中文无码久热丝袜 | 久久久久免费精品国产 | 欧美大屁股xxxxhd黑色 | 4hu四虎永久在线观看 | 精品一区二区三区波多野结衣 | 性欧美熟妇videofreesex | 波多野结衣一区二区三区av免费 | 亚洲精品一区三区三区在线观看 | 国产在线aaa片一区二区99 | 国产两女互慰高潮视频在线观看 | 人人妻人人澡人人爽欧美一区 | 九九在线中文字幕无码 | 97久久国产亚洲精品超碰热 | 日韩亚洲欧美中文高清在线 | 日本熟妇大屁股人妻 | 熟妇人妻中文av无码 | 成熟人妻av无码专区 | 装睡被陌生人摸出水好爽 | 97久久精品无码一区二区 | 国产精品久久久av久久久 | 少妇无码一区二区二三区 | 国产精品久久久午夜夜伦鲁鲁 | 精品国产成人一区二区三区 | 一个人免费观看的www视频 | 欧美日韩色另类综合 | 亚洲理论电影在线观看 | 动漫av一区二区在线观看 | 7777奇米四色成人眼影 | 色综合久久久无码网中文 | 成人精品天堂一区二区三区 | 亚洲欧美国产精品久久 | 丰满少妇女裸体bbw | a在线亚洲男人的天堂 | 无码成人精品区在线观看 | 内射爽无广熟女亚洲 | 国产精品美女久久久网av | 无码一区二区三区在线观看 | 5858s亚洲色大成网站www | 在线а√天堂中文官网 | 欧美性色19p | 国语精品一区二区三区 | 午夜精品久久久内射近拍高清 | 国产一区二区三区影院 | 国产成人亚洲综合无码 | 偷窥日本少妇撒尿chinese | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 无码午夜成人1000部免费视频 | 亚洲国产欧美日韩精品一区二区三区 | 18黄暴禁片在线观看 | 久久精品中文字幕一区 | 两性色午夜视频免费播放 | 露脸叫床粗话东北少妇 | 国内揄拍国内精品少妇国语 | 欧美一区二区三区视频在线观看 | 狠狠色丁香久久婷婷综合五月 | 成人一在线视频日韩国产 | 性做久久久久久久免费看 | 99久久人妻精品免费二区 | √天堂中文官网8在线 | 久久久久国色av免费观看性色 | 国産精品久久久久久久 | 乱码av麻豆丝袜熟女系列 | 欧美成人免费全部网站 | 精品无码国产自产拍在线观看蜜 | √8天堂资源地址中文在线 | 国产香蕉97碰碰久久人人 | 亚洲中文字幕无码中文字在线 | 色婷婷香蕉在线一区二区 | 亚洲乱码日产精品bd | 精品久久久久久人妻无码中文字幕 | 久久精品人人做人人综合试看 | 好男人社区资源 | 综合激情五月综合激情五月激情1 | 国产精品久久久久久久影院 | 午夜时刻免费入口 | 色综合久久久久综合一本到桃花网 | 色五月丁香五月综合五月 | 美女极度色诱视频国产 | 欧美亚洲日韩国产人成在线播放 | 色窝窝无码一区二区三区色欲 | 草草网站影院白丝内射 | 国产精品人人爽人人做我的可爱 | 精品偷拍一区二区三区在线看 | 波多野结衣av一区二区全免费观看 | 精品国产成人一区二区三区 | 日本熟妇大屁股人妻 | 性色av无码免费一区二区三区 | 99久久久国产精品无码免费 | 久久99久久99精品中文字幕 | 国内精品人妻无码久久久影院蜜桃 | а天堂中文在线官网 | 欧美成人午夜精品久久久 | 久久综合香蕉国产蜜臀av | 欧美三级a做爰在线观看 | 日本精品久久久久中文字幕 | 欧美zoozzooz性欧美 | 性生交大片免费看女人按摩摩 | 国产性生交xxxxx无码 | 激情亚洲一区国产精品 | 日本在线高清不卡免费播放 | 在线观看免费人成视频 | 男女超爽视频免费播放 | 激情人妻另类人妻伦 | 免费观看又污又黄的网站 | 好男人www社区 | 亚洲国产一区二区三区在线观看 | 人人爽人人澡人人高潮 | 精品国产成人一区二区三区 | 亚洲国产高清在线观看视频 | 99精品视频在线观看免费 | 丰满少妇女裸体bbw | 2020最新国产自产精品 | 久久熟妇人妻午夜寂寞影院 | 欧美成人午夜精品久久久 | 99精品国产综合久久久久五月天 | 男女下面进入的视频免费午夜 | 夜先锋av资源网站 | 玩弄人妻少妇500系列视频 | 最新国产乱人伦偷精品免费网站 | 中文字幕无码日韩欧毛 | 在线a亚洲视频播放在线观看 | 国产精品a成v人在线播放 | 国模大胆一区二区三区 | 3d动漫精品啪啪一区二区中 | 中文字幕+乱码+中文字幕一区 | 欧美老熟妇乱xxxxx | 丁香花在线影院观看在线播放 | 在线成人www免费观看视频 | 中文毛片无遮挡高清免费 | 国产成人综合美国十次 | 无码国产色欲xxxxx视频 | 少妇太爽了在线观看 | 丰满少妇弄高潮了www | 76少妇精品导航 | 国产精品对白交换视频 | 亚洲精品一区二区三区在线观看 | 精品无码国产一区二区三区av | 一本精品99久久精品77 | 午夜性刺激在线视频免费 | 国产成人无码区免费内射一片色欲 | 色一情一乱一伦一区二区三欧美 | 国产精品无套呻吟在线 | 色欲人妻aaaaaaa无码 | 亚洲中文字幕va福利 | 日韩人妻少妇一区二区三区 | 伊人色综合久久天天小片 | 国产成人精品无码播放 | 国产97色在线 | 免 | 成人aaa片一区国产精品 | 免费人成网站视频在线观看 | 精品国产一区二区三区四区在线看 | 亚洲区欧美区综合区自拍区 | 玩弄少妇高潮ⅹxxxyw | 成人综合网亚洲伊人 | 天下第一社区视频www日本 | 国产乱人伦偷精品视频 | 欧美日韩亚洲国产精品 | 中文字幕乱码中文乱码51精品 | 国产精品久久久久久亚洲影视内衣 | 亚洲色www成人永久网址 | 精品国产成人一区二区三区 | 久久熟妇人妻午夜寂寞影院 | 中文无码精品a∨在线观看不卡 | 亚洲毛片av日韩av无码 | 国产在线无码精品电影网 | 亚洲人成人无码网www国产 | 天堂在线观看www | 99精品无人区乱码1区2区3区 | 天堂а√在线中文在线 | 中文无码成人免费视频在线观看 | 中国女人内谢69xxxxxa片 | 性色欲情网站iwww九文堂 | 亚洲乱码国产乱码精品精 | 国产一区二区不卡老阿姨 | 小泽玛莉亚一区二区视频在线 | 精品午夜福利在线观看 | 亚洲乱码国产乱码精品精 | 久久久久久a亚洲欧洲av冫 | 蜜桃视频韩日免费播放 | 97夜夜澡人人爽人人喊中国片 | 狠狠综合久久久久综合网 | 男女下面进入的视频免费午夜 | 又粗又大又硬又长又爽 | 国产明星裸体无码xxxx视频 | 无码午夜成人1000部免费视频 | 蜜桃av抽搐高潮一区二区 | 亚洲熟悉妇女xxx妇女av | 久久久精品456亚洲影院 | 欧美自拍另类欧美综合图片区 | 精品国产精品久久一区免费式 | 欧美人与动性行为视频 | 亚洲精品一区三区三区在线观看 | 精品人妻人人做人人爽 | 亚洲精品一区国产 | 国产两女互慰高潮视频在线观看 | 在线观看欧美一区二区三区 | 欧美日韩一区二区三区自拍 | 精品亚洲韩国一区二区三区 | 东京无码熟妇人妻av在线网址 | 国产人妻精品一区二区三区不卡 | 国产又粗又硬又大爽黄老大爷视 | 亚洲色www成人永久网址 | 无套内谢的新婚少妇国语播放 | 国产精品久久国产精品99 | 国产手机在线αⅴ片无码观看 | 国产亚洲美女精品久久久2020 | 99精品视频在线观看免费 | 国产成人无码区免费内射一片色欲 | 久久午夜无码鲁丝片 | 131美女爱做视频 | 大色综合色综合网站 | 久久久亚洲欧洲日产国码αv | 人人超人人超碰超国产 | 国精产品一区二区三区 | 婷婷五月综合激情中文字幕 | 纯爱无遮挡h肉动漫在线播放 | 亚洲精品国产精品乱码不卡 | 亚洲精品久久久久avwww潮水 | 四虎永久在线精品免费网址 | 色婷婷久久一区二区三区麻豆 | 亚洲精品鲁一鲁一区二区三区 | 国产深夜福利视频在线 | 一个人看的www免费视频在线观看 | av香港经典三级级 在线 | 精品国偷自产在线 | 精品无码一区二区三区的天堂 | 成人女人看片免费视频放人 | 漂亮人妻洗澡被公强 日日躁 | 国产精品无码一区二区桃花视频 | 黄网在线观看免费网站 | 日产精品99久久久久久 | 女人和拘做爰正片视频 | 午夜熟女插插xx免费视频 | 国产精品免费大片 | 国产精品无码一区二区桃花视频 | 国产猛烈高潮尖叫视频免费 | 精品国精品国产自在久国产87 | 久久久久亚洲精品男人的天堂 | 久久综合色之久久综合 | 日本一卡二卡不卡视频查询 | 中文字幕乱码中文乱码51精品 | 野外少妇愉情中文字幕 | 人妻aⅴ无码一区二区三区 | 午夜男女很黄的视频 | 内射老妇bbwx0c0ck | 波多野结衣av在线观看 | 狂野欧美激情性xxxx | 大胆欧美熟妇xx | 国产乡下妇女做爰 | 最新国产乱人伦偷精品免费网站 | 国产成人久久精品流白浆 | 麻豆国产人妻欲求不满谁演的 | 国产午夜视频在线观看 | 大肉大捧一进一出视频出来呀 | 国产口爆吞精在线视频 | 国产激情无码一区二区 | 人妻天天爽夜夜爽一区二区 | 日日麻批免费40分钟无码 | 曰韩少妇内射免费播放 | 日本熟妇乱子伦xxxx | 高潮毛片无遮挡高清免费视频 | 精品久久久中文字幕人妻 | 色综合久久久无码中文字幕 | 强辱丰满人妻hd中文字幕 | 国产无遮挡又黄又爽免费视频 | 亚洲欧美日韩综合久久久 | 日日天干夜夜狠狠爱 | 又大又紧又粉嫩18p少妇 | 99国产精品白浆在线观看免费 | 中文毛片无遮挡高清免费 | 国产精品va在线播放 | 国产手机在线αⅴ片无码观看 | 性生交大片免费看女人按摩摩 | 正在播放老肥熟妇露脸 | 日本欧美一区二区三区乱码 | 波多野结衣av在线观看 | aⅴ亚洲 日韩 色 图网站 播放 | 国产超碰人人爽人人做人人添 | 性欧美大战久久久久久久 | 国产精品久久久久久久影院 | 国内精品一区二区三区不卡 | 人妻少妇精品无码专区动漫 | 给我免费的视频在线观看 | 午夜嘿嘿嘿影院 | 免费无码一区二区三区蜜桃大 | 99久久人妻精品免费二区 | 在线 国产 欧美 亚洲 天堂 | 成 人 免费观看网站 | 丁香啪啪综合成人亚洲 | 亚洲中文字幕乱码av波多ji | 玩弄中年熟妇正在播放 | 久久无码专区国产精品s | 亚洲色在线无码国产精品不卡 | 久久久久亚洲精品男人的天堂 | 人妻熟女一区 | 精品夜夜澡人妻无码av蜜桃 | av人摸人人人澡人人超碰下载 | 人人妻人人澡人人爽欧美精品 | 中文字幕无线码 | 野外少妇愉情中文字幕 | 无码人妻丰满熟妇区五十路百度 | 久久精品女人天堂av免费观看 | 日日摸夜夜摸狠狠摸婷婷 | 毛片内射-百度 | 午夜无码区在线观看 | 国产av无码专区亚洲a∨毛片 | 久久久无码中文字幕久... | 国产av人人夜夜澡人人爽麻豆 | 97久久国产亚洲精品超碰热 | 女人和拘做爰正片视频 | 日韩精品乱码av一区二区 | 亚洲一区二区三区含羞草 | 日本一卡二卡不卡视频查询 | 亚洲区欧美区综合区自拍区 | 天下第一社区视频www日本 | 日本精品人妻无码免费大全 | 窝窝午夜理论片影院 | 黑人巨大精品欧美一区二区 | 人人澡人人妻人人爽人人蜜桃 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲の无码国产の无码步美 | 国产精品人人爽人人做我的可爱 | 日本乱偷人妻中文字幕 | 精品国产麻豆免费人成网站 | 人妻少妇精品无码专区二区 | 两性色午夜视频免费播放 | 丰满人妻翻云覆雨呻吟视频 | 国内揄拍国内精品人妻 | 宝宝好涨水快流出来免费视频 | 日本欧美一区二区三区乱码 | 国产极品美女高潮无套在线观看 | 亚洲国产精品无码一区二区三区 | 亚洲无人区午夜福利码高清完整版 | 精品久久综合1区2区3区激情 | 人人妻人人藻人人爽欧美一区 | 在线亚洲高清揄拍自拍一品区 | 亚洲热妇无码av在线播放 | 国产无遮挡又黄又爽免费视频 | 中文字幕无码视频专区 | 亚洲中文字幕久久无码 | 国产综合久久久久鬼色 | 日本www一道久久久免费榴莲 | 成在人线av无码免费 | 性欧美熟妇videofreesex | 色综合久久久久综合一本到桃花网 | 午夜理论片yy44880影院 | 国产情侣作爱视频免费观看 | 狠狠综合久久久久综合网 | 午夜嘿嘿嘿影院 | 性开放的女人aaa片 | 国产无遮挡又黄又爽免费视频 | 粗大的内捧猛烈进出视频 | 亚洲精品午夜无码电影网 | 久久国内精品自在自线 | 久久人人97超碰a片精品 | 最新国产乱人伦偷精品免费网站 | 欧美高清在线精品一区 | 超碰97人人做人人爱少妇 | 国产又爽又猛又粗的视频a片 | 在线播放无码字幕亚洲 | 人人妻人人澡人人爽人人精品 | 精品无码一区二区三区的天堂 | 国产绳艺sm调教室论坛 | 亚洲精品成人av在线 | 中文字幕日韩精品一区二区三区 | 日韩亚洲欧美中文高清在线 | 熟妇女人妻丰满少妇中文字幕 | 国产成人一区二区三区别 | 性做久久久久久久免费看 | 内射老妇bbwx0c0ck | 纯爱无遮挡h肉动漫在线播放 | 久久无码专区国产精品s | 色婷婷欧美在线播放内射 | 亚洲国产欧美国产综合一区 | 精品久久久无码人妻字幂 | 蜜桃无码一区二区三区 | 18禁黄网站男男禁片免费观看 | 久久精品一区二区三区四区 | 少妇性l交大片欧洲热妇乱xxx | 国产午夜亚洲精品不卡下载 | 日日躁夜夜躁狠狠躁 | 亚洲狠狠婷婷综合久久 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 97久久精品无码一区二区 | 欧美兽交xxxx×视频 | 精品国产av色一区二区深夜久久 | 国产精品.xx视频.xxtv | 人妻少妇精品视频专区 | 巨爆乳无码视频在线观看 | 国产精品久久久久久亚洲影视内衣 | 2020久久超碰国产精品最新 | 国产农村妇女高潮大叫 | 全球成人中文在线 | 欧美国产日韩亚洲中文 | 无码帝国www无码专区色综合 | 精品aⅴ一区二区三区 | 天堂无码人妻精品一区二区三区 | 大肉大捧一进一出视频出来呀 | 国产亚洲精品精品国产亚洲综合 | а√天堂www在线天堂小说 | 亚洲国产精品毛片av不卡在线 | 久久久久久久女国产乱让韩 | 国产亚洲精品精品国产亚洲综合 | 99精品视频在线观看免费 | 亚洲精品成人福利网站 | 国产农村乱对白刺激视频 | 日本熟妇人妻xxxxx人hd | 国产麻豆精品一区二区三区v视界 | 天堂在线观看www | 狂野欧美性猛交免费视频 | 欧美性生交xxxxx久久久 | 亚洲综合无码久久精品综合 | 精品人妻中文字幕有码在线 | 双乳奶水饱满少妇呻吟 | 色婷婷综合中文久久一本 | 日日噜噜噜噜夜夜爽亚洲精品 | 人人妻人人澡人人爽欧美一区 | 国语自产偷拍精品视频偷 | 国产网红无码精品视频 | 内射白嫩少妇超碰 | 欧美精品国产综合久久 | 精品 日韩 国产 欧美 视频 | 久久久av男人的天堂 | 国产又粗又硬又大爽黄老大爷视 | 日日碰狠狠丁香久燥 | 国产精品毛多多水多 | 欧美精品一区二区精品久久 | 国产suv精品一区二区五 | 亚洲精品一区二区三区在线 | 日本精品人妻无码免费大全 | 亚洲综合另类小说色区 | 搡女人真爽免费视频大全 | 97夜夜澡人人双人人人喊 | 国产一区二区三区精品视频 | 欧美第一黄网免费网站 | 亚洲男人av香蕉爽爽爽爽 | 欧美三级不卡在线观看 | 国产激情无码一区二区 | 无码人妻精品一区二区三区下载 | 亚洲精品无码人妻无码 | 麻豆果冻传媒2021精品传媒一区下载 | 欧美肥老太牲交大战 | 国产精品高潮呻吟av久久4虎 | 久久久久久av无码免费看大片 | 欧美日韩一区二区免费视频 | 精品人妻人人做人人爽夜夜爽 | 国产九九九九九九九a片 | 亚洲 高清 成人 动漫 | 97夜夜澡人人爽人人喊中国片 | 欧美日本日韩 | 日欧一片内射va在线影院 | 久久精品国产亚洲精品 | 蜜臀av在线播放 久久综合激激的五月天 | 欧美日本日韩 | 全球成人中文在线 | 日日橹狠狠爱欧美视频 | 丝袜美腿亚洲一区二区 | 亚洲中文无码av永久不收费 | 日韩精品久久久肉伦网站 | 亚洲精品中文字幕久久久久 | 在教室伦流澡到高潮hnp视频 | 亚洲综合伊人久久大杳蕉 | 狂野欧美性猛xxxx乱大交 | 亚洲午夜无码久久 | 精品无码国产一区二区三区av | 婷婷综合久久中文字幕蜜桃三电影 | 久久久精品456亚洲影院 | 撕开奶罩揉吮奶头视频 | 国产精品无码一区二区桃花视频 | 亚洲熟妇自偷自拍另类 | 亚洲理论电影在线观看 | 久久久国产精品无码免费专区 | 国产精品高潮呻吟av久久 | 无码国产乱人伦偷精品视频 | 免费视频欧美无人区码 | 国产精品国产三级国产专播 | 丁香花在线影院观看在线播放 | 丁香花在线影院观看在线播放 | 国产av无码专区亚洲awww | 国产一区二区三区四区五区加勒比 | 精品熟女少妇av免费观看 | 日韩av无码一区二区三区不卡 | 欧美喷潮久久久xxxxx | 中文字幕人成乱码熟女app | 成人欧美一区二区三区 | 少女韩国电视剧在线观看完整 | 国产69精品久久久久app下载 | 在线亚洲高清揄拍自拍一品区 | 久久久久久亚洲精品a片成人 | 一本大道伊人av久久综合 | 亚洲人亚洲人成电影网站色 | 偷窥村妇洗澡毛毛多 | 黑人巨大精品欧美一区二区 | 成人无码精品1区2区3区免费看 | 日欧一片内射va在线影院 | 亚洲人成无码网www | 无码人妻黑人中文字幕 | 成熟妇人a片免费看网站 | 日日天日日夜日日摸 | 人妻少妇被猛烈进入中文字幕 | 一本一道久久综合久久 | 久久精品99久久香蕉国产色戒 | 久久精品人妻少妇一区二区三区 | 无套内谢老熟女 | 欧美乱妇无乱码大黄a片 | 国产成人av免费观看 | 亚洲男人av天堂午夜在 | 国产疯狂伦交大片 | 欧美性生交xxxxx久久久 | 欧美精品国产综合久久 | 日韩精品无码免费一区二区三区 | 波多野结衣 黑人 | 一本久久a久久精品亚洲 | 未满小14洗澡无码视频网站 | 亚洲人亚洲人成电影网站色 | 午夜理论片yy44880影院 | yw尤物av无码国产在线观看 | 午夜精品一区二区三区的区别 | 婷婷色婷婷开心五月四房播播 | 欧美午夜特黄aaaaaa片 | 激情五月综合色婷婷一区二区 | 日韩欧美中文字幕在线三区 | 午夜男女很黄的视频 | 成人精品一区二区三区中文字幕 | 国产av一区二区精品久久凹凸 | 天堂а√在线地址中文在线 | 亚洲乱亚洲乱妇50p | 国产两女互慰高潮视频在线观看 | 大地资源中文第3页 | 牲交欧美兽交欧美 | 成人三级无码视频在线观看 | 亚洲欧美国产精品久久 | 99麻豆久久久国产精品免费 | 在线视频网站www色 | 在线精品亚洲一区二区 | 人妻与老人中文字幕 | 亚洲精品一区三区三区在线观看 | 日韩视频 中文字幕 视频一区 | 天天拍夜夜添久久精品大 | 久久精品国产精品国产精品污 | 久久精品丝袜高跟鞋 | 亚洲熟妇自偷自拍另类 | 成 人影片 免费观看 | 丰满人妻精品国产99aⅴ | 国产成人一区二区三区别 | 人人爽人人澡人人高潮 | 日本一区二区三区免费高清 | 国产又粗又硬又大爽黄老大爷视 | 亚洲а∨天堂久久精品2021 | 免费无码午夜福利片69 | 久久精品女人的天堂av | 亚洲成a人一区二区三区 | 牲欲强的熟妇农村老妇女 | 欧美xxxx黑人又粗又长 | 亚洲综合无码久久精品综合 | 男女下面进入的视频免费午夜 | 久久精品人人做人人综合试看 | 性欧美牲交xxxxx视频 | 久久99精品久久久久婷婷 | 日韩亚洲欧美精品综合 | 亚洲乱亚洲乱妇50p | 俺去俺来也在线www色官网 | 无套内谢老熟女 | 色综合视频一区二区三区 | 丰满岳乱妇在线观看中字无码 | 欧美肥老太牲交大战 | 国产农村乱对白刺激视频 | 欧美野外疯狂做受xxxx高潮 | 一本久久a久久精品亚洲 | 大肉大捧一进一出视频出来呀 | 老太婆性杂交欧美肥老太 | 天天综合网天天综合色 | 国产黑色丝袜在线播放 | 亚洲国产精品一区二区第一页 | 日本一卡2卡3卡四卡精品网站 | 双乳奶水饱满少妇呻吟 | 日本一区二区三区免费播放 | 久久人人爽人人爽人人片av高清 | 成 人影片 免费观看 | 5858s亚洲色大成网站www | 漂亮人妻洗澡被公强 日日躁 | 色欲久久久天天天综合网精品 | 国产猛烈高潮尖叫视频免费 | 欧美人与牲动交xxxx | 日韩精品无码一区二区中文字幕 | 欧美猛少妇色xxxxx | 亚洲 激情 小说 另类 欧美 | 国产精品第一国产精品 | 小鲜肉自慰网站xnxx | 国产精品久久久一区二区三区 | 一本久久a久久精品vr综合 | 亚洲国产精品一区二区美利坚 | 粉嫩少妇内射浓精videos | 欧美日韩综合一区二区三区 | 欧美xxxxx精品 | 国产情侣作爱视频免费观看 | 久久午夜无码鲁丝片秋霞 | 最新版天堂资源中文官网 | 色婷婷av一区二区三区之红樱桃 | 又粗又大又硬又长又爽 | 天干天干啦夜天干天2017 | 18精品久久久无码午夜福利 | 国产人妖乱国产精品人妖 | 国内少妇偷人精品视频 | 精品无人区无码乱码毛片国产 | 天天做天天爱天天爽综合网 | 麻豆国产人妻欲求不满 | 成人精品视频一区二区三区尤物 | 国产亚洲精品久久久久久国模美 | 久久熟妇人妻午夜寂寞影院 | 男女超爽视频免费播放 | 2020最新国产自产精品 | 正在播放老肥熟妇露脸 | 精品无人区无码乱码毛片国产 | 装睡被陌生人摸出水好爽 | 久久精品99久久香蕉国产色戒 | 天堂无码人妻精品一区二区三区 | 永久免费观看美女裸体的网站 | 人人妻人人澡人人爽人人精品 | 人妻人人添人妻人人爱 | 色偷偷人人澡人人爽人人模 | 无码人妻精品一区二区三区下载 | 伊人久久大香线蕉午夜 | 国产三级久久久精品麻豆三级 | 国産精品久久久久久久 | 黑森林福利视频导航 | aⅴ在线视频男人的天堂 | 久久99精品久久久久久 | 亚洲无人区午夜福利码高清完整版 | 性欧美牲交xxxxx视频 | 午夜福利试看120秒体验区 | 国产精品免费大片 | www国产亚洲精品久久网站 | 兔费看少妇性l交大片免费 | 亚洲 欧美 激情 小说 另类 | 网友自拍区视频精品 | 一区二区三区乱码在线 | 欧洲 | 国产亚洲精品久久久闺蜜 | 国产成人精品必看 | 日韩av无码一区二区三区不卡 | 欧洲美熟女乱又伦 | 内射后入在线观看一区 | 亚洲乱码日产精品bd | 亚洲一区二区三区四区 | 欧美激情一区二区三区成人 | 国产精品视频免费播放 | 内射爽无广熟女亚洲 | 久久人人爽人人人人片 | 婷婷五月综合激情中文字幕 | 国产精品va在线观看无码 | 久在线观看福利视频 | 一本久久伊人热热精品中文字幕 | 国产精品无码一区二区桃花视频 | 午夜成人1000部免费视频 | 日本精品高清一区二区 | 中文毛片无遮挡高清免费 | 日本va欧美va欧美va精品 | 日日鲁鲁鲁夜夜爽爽狠狠 | 人妻人人添人妻人人爱 | 欧美肥老太牲交大战 | 中文精品久久久久人妻不卡 | 久久人人爽人人爽人人片ⅴ | 国产舌乚八伦偷品w中 | 未满成年国产在线观看 | 国产激情艳情在线看视频 | 国产精品久久久一区二区三区 | 东京热男人av天堂 | 亚洲色www成人永久网址 | 国语精品一区二区三区 | 午夜精品一区二区三区在线观看 | 久久久国产一区二区三区 | 国产无遮挡吃胸膜奶免费看 | 久久久精品成人免费观看 | 97se亚洲精品一区 | 波多野结衣乳巨码无在线观看 | 亚洲一区二区三区在线观看网站 | 亚洲欧美日韩国产精品一区二区 | 5858s亚洲色大成网站www | 欧美真人作爱免费视频 | 亚洲 高清 成人 动漫 | 麻豆果冻传媒2021精品传媒一区下载 | 中文字幕人成乱码熟女app | 人妻少妇被猛烈进入中文字幕 | 久久精品中文闷骚内射 | 无套内谢老熟女 | 日韩在线不卡免费视频一区 | 国产精品人妻一区二区三区四 | 日韩欧美中文字幕在线三区 | 亚洲色欲色欲欲www在线 | 一个人免费观看的www视频 | 久久久精品456亚洲影院 | 亚洲自偷精品视频自拍 | 亚洲啪av永久无码精品放毛片 | 精品成人av一区二区三区 | 国产精品无码一区二区三区不卡 | 在线精品国产一区二区三区 | 综合人妻久久一区二区精品 | 正在播放东北夫妻内射 | 国产人成高清在线视频99最全资源 | 亚洲国产成人av在线观看 | 性欧美疯狂xxxxbbbb | www国产亚洲精品久久网站 | 国产真人无遮挡作爱免费视频 | 色噜噜亚洲男人的天堂 | 日韩精品乱码av一区二区 | 亚洲一区二区三区香蕉 | 爽爽影院免费观看 | 中文字幕无码日韩欧毛 | 国产亚洲精品久久久久久 | 亚洲精品久久久久avwww潮水 | 日日摸日日碰夜夜爽av | 精品久久综合1区2区3区激情 | 日日夜夜撸啊撸 | 99久久精品日本一区二区免费 | 香蕉久久久久久av成人 | 国产乱人无码伦av在线a | 老司机亚洲精品影院 | 在线天堂新版最新版在线8 | 午夜精品久久久久久久 | 东京热一精品无码av | 88国产精品欧美一区二区三区 | 久久久av男人的天堂 | 无码一区二区三区在线 | 少妇无码av无码专区在线观看 | 无码毛片视频一区二区本码 | 亚洲 另类 在线 欧美 制服 | 男人扒开女人内裤强吻桶进去 | 精品成人av一区二区三区 | 小泽玛莉亚一区二区视频在线 | 人妻互换免费中文字幕 | 日本一区二区三区免费高清 | 国产精品高潮呻吟av久久 | 国产免费无码一区二区视频 | 国产亚洲视频中文字幕97精品 | 国产区女主播在线观看 | 亚洲欧洲中文日韩av乱码 | 好爽又高潮了毛片免费下载 | 国产成人综合在线女婷五月99播放 | 久久久久成人片免费观看蜜芽 | 国产电影无码午夜在线播放 | 99久久精品无码一区二区毛片 | 国产精品久久国产三级国 | 亚洲国产精品一区二区美利坚 | 精品人妻中文字幕有码在线 | 中国大陆精品视频xxxx | 日日摸夜夜摸狠狠摸婷婷 | 中文字幕无线码免费人妻 | 丰满少妇高潮惨叫视频 | 国产欧美熟妇另类久久久 | 久久久久久国产精品无码下载 | 国产激情艳情在线看视频 | 国产小呦泬泬99精品 | 女高中生第一次破苞av | 女人被爽到呻吟gif动态图视看 | 国产 浪潮av性色四虎 | 鲁鲁鲁爽爽爽在线视频观看 | 欧美精品无码一区二区三区 | 欧美真人作爱免费视频 | 无码国内精品人妻少妇 | 成人精品视频一区二区 | 欧美丰满少妇xxxx性 | 天天做天天爱天天爽综合网 | 亚洲国产成人av在线观看 | 偷窥日本少妇撒尿chinese | 久久国产精品萌白酱免费 | 国产成人一区二区三区在线观看 | 色欲av亚洲一区无码少妇 | 少妇久久久久久人妻无码 | 欧美精品国产综合久久 | 黑人巨大精品欧美一区二区 | 亚洲の无码国产の无码步美 | 国内丰满熟女出轨videos | 98国产精品综合一区二区三区 | 蜜桃无码一区二区三区 | 日本精品少妇一区二区三区 | 婷婷色婷婷开心五月四房播播 | 国产超级va在线观看视频 | 精品国产av色一区二区深夜久久 | 成人免费视频视频在线观看 免费 | 久久久www成人免费毛片 | 久久亚洲精品中文字幕无男同 | 十八禁真人啪啪免费网站 | 伊人久久大香线焦av综合影院 | 妺妺窝人体色www在线小说 | 老熟妇乱子伦牲交视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 亚洲精品国偷拍自产在线麻豆 | 亚洲精品欧美二区三区中文字幕 | 九九综合va免费看 | 国产成人精品三级麻豆 | 狠狠色色综合网站 | 性欧美熟妇videofreesex | 国产成人精品视频ⅴa片软件竹菊 | 亚洲国产精品美女久久久久 | 丰满妇女强制高潮18xxxx | 精品夜夜澡人妻无码av蜜桃 | 国产精品-区区久久久狼 | 乱中年女人伦av三区 | 免费人成网站视频在线观看 | 欧美激情一区二区三区成人 | 国产9 9在线 | 中文 | 国产激情无码一区二区app | 国产精品第一国产精品 | 激情内射亚州一区二区三区爱妻 | 久久亚洲日韩精品一区二区三区 | 老熟妇仑乱视频一区二区 | 在线观看欧美一区二区三区 | 亚洲 欧美 激情 小说 另类 | 小sao货水好多真紧h无码视频 | 特黄特色大片免费播放器图片 | 久久天天躁狠狠躁夜夜免费观看 | 一本精品99久久精品77 | 久热国产vs视频在线观看 | 久久久亚洲欧洲日产国码αv | 九月婷婷人人澡人人添人人爽 | 久久久成人毛片无码 | 欧美xxxx黑人又粗又长 | 免费无码的av片在线观看 | 俺去俺来也在线www色官网 | 久久人人97超碰a片精品 | 亚洲 激情 小说 另类 欧美 | 偷窥日本少妇撒尿chinese | 无码国产乱人伦偷精品视频 | 久久久久久久女国产乱让韩 | 老太婆性杂交欧美肥老太 | 国产精品久免费的黄网站 | 在线欧美精品一区二区三区 | 曰韩无码二三区中文字幕 | av人摸人人人澡人人超碰下载 | 欧美熟妇另类久久久久久多毛 | 欧美丰满少妇xxxx性 | 国产精品爱久久久久久久 | 日本在线高清不卡免费播放 | 国产 精品 自在自线 | 国产suv精品一区二区五 | 无码纯肉视频在线观看 | 伊人色综合久久天天小片 | 永久黄网站色视频免费直播 | 初尝人妻少妇中文字幕 | 亚洲一区二区三区国产精华液 | 欧美怡红院免费全部视频 | 亚洲精品久久久久avwww潮水 | 国产成人精品视频ⅴa片软件竹菊 | 欧美日韩一区二区综合 | 亚洲精品无码人妻无码 | 国产亚洲精品久久久久久大师 | 亚洲理论电影在线观看 | 宝宝好涨水快流出来免费视频 | 久久久精品456亚洲影院 | 亚洲欧美国产精品久久 | 日本熟妇人妻xxxxx人hd | 麻花豆传媒剧国产免费mv在线 | 丝袜人妻一区二区三区 | 天堂无码人妻精品一区二区三区 | 一区二区传媒有限公司 | 一本久久a久久精品vr综合 | 精品国精品国产自在久国产87 | 真人与拘做受免费视频 | 影音先锋中文字幕无码 | 国产亚洲精品久久久久久国模美 | 成熟人妻av无码专区 | 性做久久久久久久久 | 亚洲一区二区三区四区 | 成人aaa片一区国产精品 | 人人爽人人澡人人高潮 | 国产亚洲精品久久久闺蜜 | 国产深夜福利视频在线 | 国产va免费精品观看 | 思思久久99热只有频精品66 | 欧美日韩综合一区二区三区 | 亚洲精品一区二区三区婷婷月 | 5858s亚洲色大成网站www | 一本久道久久综合婷婷五月 | 少妇无码一区二区二三区 | 亚洲欧美国产精品久久 | 全球成人中文在线 | 300部国产真实乱 | 国产成人久久精品流白浆 | 精品一区二区三区无码免费视频 | 亚洲爆乳精品无码一区二区三区 | 久久精品国产99久久6动漫 | 天堂а√在线地址中文在线 | 国产精品国产自线拍免费软件 | 国产亚洲精品久久久久久大师 | 免费无码肉片在线观看 | 亚洲第一网站男人都懂 | 99久久婷婷国产综合精品青草免费 | 久久99热只有频精品8 | 亚洲一区二区三区香蕉 | 偷窥日本少妇撒尿chinese | 无码av最新清无码专区吞精 | 人人妻人人藻人人爽欧美一区 | 在线看片无码永久免费视频 | 成人无码精品1区2区3区免费看 | 亚洲精品无码国产 | 荫蒂被男人添的好舒服爽免费视频 | 国产午夜福利100集发布 | 欧美乱妇无乱码大黄a片 | 久久 国产 尿 小便 嘘嘘 | 日日麻批免费40分钟无码 | 久久综合九色综合欧美狠狠 | 丰满人妻翻云覆雨呻吟视频 | 亚洲熟妇色xxxxx欧美老妇 | 性欧美videos高清精品 | 亚洲男女内射在线播放 | 国产精品美女久久久网av | 久久精品99久久香蕉国产色戒 | 思思久久99热只有频精品66 | 国产97人人超碰caoprom |