婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > 解析ABP框架中的事務(wù)處理和工作單元

解析ABP框架中的事務(wù)處理和工作單元

熱門標(biāo)簽:聯(lián)通官網(wǎng)400電話辦理 外呼電話機(jī)器人成本 400電話辦理怎么樣 網(wǎng)絡(luò)電話外呼系統(tǒng)上海 百應(yīng)電話機(jī)器人外呼系統(tǒng) 西寧呼叫中心外呼系統(tǒng)線路商 蘇州如何辦理400電話 地圖標(biāo)注軟件免費(fèi)下載 臨沂智能電話機(jī)器人加盟

通用連接和事務(wù)管理方法
連接和事務(wù)管理是使用數(shù)據(jù)庫(kù)的應(yīng)用程序最重要的概念之一。當(dāng)你開啟一個(gè)數(shù)據(jù)庫(kù)連接,什么時(shí)候開始事務(wù),如何釋放連接...諸如此類的。

正如大家都知道的,.Net使用連接池(connection pooling)。因此,創(chuàng)建一個(gè)連接實(shí)際上是從連接池中取得一個(gè)連接,會(huì)這么做是因?yàn)閯?chuàng)建新連接會(huì)有成本。如果沒有任何連接存在于連接池中,一個(gè)新的連接對(duì)象會(huì)被創(chuàng)建并且添加到連接池中。當(dāng)你釋放連接,它實(shí)際上是將這個(gè)連接對(duì)象送回到連接池。這并不是實(shí)際意義上的釋放。這個(gè)機(jī)制是由.Net所提供的。因此,我們應(yīng)該在使用完之后釋放掉連接對(duì)象。這就是最佳實(shí)踐。

在應(yīng)用程序中,有兩個(gè)通用的方來創(chuàng)建/釋放一個(gè)數(shù)據(jù)庫(kù)連接:

第一個(gè)方法:在Web請(qǐng)求到達(dá)的時(shí)候,創(chuàng)建一個(gè)連接對(duì)象。(Application_BeginRequest這個(gè)位于global.asax中的事件),使用同一個(gè)連接對(duì)象來處理所有的數(shù)據(jù)庫(kù)操作,并且在請(qǐng)求結(jié)束的時(shí)候關(guān)閉/釋放這個(gè)連接 (Application_EndRequest事件)。

這是個(gè)簡(jiǎn)易但卻沒效率的方法,原因:

  • 或許這個(gè)Web請(qǐng)求不需要操作數(shù)據(jù)庫(kù),但是連接卻會(huì)開啟。這對(duì)于連接池來說是個(gè)毫無效率的使用方式。
  • 這可能會(huì)讓W(xué)eb請(qǐng)求的運(yùn)行時(shí)間變長(zhǎng),并且數(shù)據(jù)庫(kù)操作還會(huì)需要一些執(zhí)行。這也是一種沒效率的連接池使用方式。
  • 這對(duì)于Web應(yīng)用來說是可行的。如果你的應(yīng)用程序是Widnows Service,這可能就無法被實(shí)現(xiàn)了。
  • 同樣的這是一個(gè)使用事務(wù)式的數(shù)據(jù)庫(kù)操作最佳場(chǎng)景。如果有一個(gè)操作發(fā)生失敗,所有的操作都會(huì)回滾。因?yàn)槭聞?wù)會(huì)鎖住數(shù)據(jù)庫(kù)中的一些數(shù)據(jù)列(事件數(shù)據(jù)表),它必定要是短暫的。

第二個(gè)方法: 創(chuàng)建一個(gè)連接當(dāng)需要的時(shí)候(只要在使用它之前)并且釋放它在使用它之后。這是相當(dāng)高效的,但是就得乏味而且反復(fù)的去進(jìn)行(創(chuàng)建/釋放連接)。

ABP的連接和事務(wù)管理
ABP綜合上述兩個(gè)連接管理的方法,并且提供一個(gè)簡(jiǎn)單而且高效的模型。

1.倉(cāng)儲(chǔ)類(Repository classes)

倉(cāng)儲(chǔ)是主要的數(shù)據(jù)庫(kù)操作的類。ABP開啟了一個(gè)數(shù)據(jù)庫(kù)連接并且在進(jìn)入到倉(cāng)儲(chǔ)方法時(shí)會(huì)啟用一個(gè)事務(wù)。因此,你可以安全地使用連接于倉(cāng)儲(chǔ)方法中。在倉(cāng)儲(chǔ)方法結(jié)束后,事務(wù)會(huì)被提交并且會(huì)釋放掉連接。假如倉(cāng)儲(chǔ)方法拋出任何異常,事務(wù)會(huì)被回滾并且釋放掉連接。在這個(gè)模式中,倉(cāng)儲(chǔ)方法是單元性的(一個(gè)工作單元unit of work)。ABP在處理上述那些動(dòng)作都是全自動(dòng)的。在這里,有一個(gè)簡(jiǎn)單的倉(cāng)儲(chǔ):

public class ContentRepository : NhRepositoryBaseContent>, IContentRepository
{
  public ListContent> GetActiveContents(string searchCondition)
  {
    var query = from content in Session.QueryContent>()
          where content.IsActive  !content.IsDeleted
          select content;

    if (string.IsNullOrEmpty(searchCondition))
    {
      query = query.Where(content => content.Text.Contains(searchCondition));
    }

    return query.ToList();
  }
}

 

這個(gè)示例使用NHibernate作為ORM框架。如上所示,不需要撰寫任何數(shù)據(jù)庫(kù)連接操作(NHibernate中的Session)的程序代碼。

假如倉(cāng)儲(chǔ)方法調(diào)用另一個(gè)倉(cāng)儲(chǔ)方法(一般來說,若工作單元方法調(diào)用另一個(gè)工作單元的方法),都使用同一個(gè)連接和事務(wù)。第一個(gè)被調(diào)用到的倉(cāng)儲(chǔ)方法負(fù)責(zé)管理連接和事務(wù),而其余被它調(diào)用的倉(cāng)儲(chǔ)方法則只單純使用不管理。

2.應(yīng)用服務(wù)(Application service classes)

一個(gè)應(yīng)用服務(wù)的方法也被考慮使用工作單元。如果我們擁有一個(gè)應(yīng)用服務(wù)方法如下:

public class PersonAppService : IPersonAppService
{
  private readonly IPersonRepository _personRepository;
  private readonly IStatisticsRepository _statisticsRepository;

  public PersonAppService(IPersonRepository personRepository, IStatisticsRepository statisticsRepository)
  {
    _personRepository = personRepository;
    _statisticsRepository = statisticsRepository;
  }

  public void CreatePerson(CreatePersonInput input)
  {
    var person = new Person { Name = input.Name, EmailAddress = input.EmailAddress };
    _personRepository.Insert(person);
    _statisticsRepository.IncrementPeopleCount();
  }
}

 

在CreatePerson方法中,我們新增一個(gè)person使用person倉(cāng)儲(chǔ)并且使用statistics倉(cāng)儲(chǔ)增加總people數(shù)量。兩個(gè)倉(cāng)儲(chǔ)共享同一個(gè)連接和事務(wù)于這個(gè)例子中,因?yàn)檫@是一個(gè)應(yīng)用服務(wù)的方法。ABP開啟一個(gè)數(shù)據(jù)庫(kù)連接并且開啟一個(gè)事務(wù)于進(jìn)入到CreationPerson這個(gè)方法,若沒有任何異常拋出,接著提交這個(gè)事務(wù)于方法結(jié)尾時(shí),若有異常被拋出,則會(huì)回滾這個(gè)事務(wù)。在這種機(jī)制下,所有數(shù)據(jù)庫(kù)的操作在CreatePerson中,都成了單元性的了(工作單元)。

3.工作單元(Unit of work)

工作單元在后臺(tái)替?zhèn)}儲(chǔ)和應(yīng)用服務(wù)的方法工作。假如你想要控制數(shù)據(jù)庫(kù)的連接和事務(wù),你就需要直接操作工作單元。下面有兩個(gè)直接使用的示例:

首要且最好的使用UnitOfWorkAttribute的方式如下:

[UnitOfWork]
public void CreatePerson(CreatePersonInput input)
{
  var person = new Person { Name = input.Name, EmailAddress = input.EmailAddress };
  _personRepository.Insert(person);
  _statisticsRepository.IncrementPeopleCount();
}

因此,CreatePerson方法轉(zhuǎn)變成工作單元并且管理數(shù)據(jù)庫(kù)連接和事務(wù),兩個(gè)倉(cāng)儲(chǔ)對(duì)象都使用相同的工作單元。要注意,假如這是應(yīng)用服務(wù)的方法則不需要添加UnitOfWork屬性,見工作單元方法:第三章,3.3.5。

第二個(gè)示例是使用IUnitOfWorkManager.Begin(...)方法如下所示:

 public class MyService
{
  private readonly IUnitOfWorkManager _unitOfWorkManager;
  private readonly IPersonRepository _personRepository;
  private readonly IStatisticsRepository _statisticsRepository;

  public MyService(IUnitOfWorkManager unitOfWorkManager, IPersonRepository personRepository, IStatisticsRepository statisticsRepository)
  {
    _unitOfWorkManager = unitOfWorkManager;
    _personRepository = personRepository;
    _statisticsRepository = statisticsRepository;
  }

  public void CreatePerson(CreatePersonInput input)
  {
    var person = new Person { Name = input.Name, EmailAddress = input.EmailAddress };

    using (var unitOfWork = _unitOfWorkManager.Begin())
    {
      _personRepository.Insert(person);
      _statisticsRepository.IncrementPeopleCount();

      unitOfWork.Complete();
    }
  }
}

你可以注入并且使用IUnitOfWorkManager,如上所示。因此,你可以創(chuàng)建更多的有限范圍 (limited scope)的工作單元。在這個(gè)機(jī)制中,你通常可以手動(dòng)調(diào)用Complete方法。如果你不調(diào)用,事務(wù)會(huì)回滾并且所有的異常都不會(huì)被儲(chǔ)存。Begin方法被重寫從而設(shè)置工作單元的選項(xiàng)。

這很棒,不過除非你有很好的理由,否則還是少用UnitOfWork屬性。

工作單元
1.禁用工作單元(Disabling unit of work)

你或許會(huì)想要禁用應(yīng)用服務(wù)方法的工作單元(因?yàn)樗J(rèn)是啟用的)。要想做到這個(gè),使用UnitOfWorkAttribute的IsDisabled屬性。示例如下:

[UnitOfWork(IsDisabled = true)]
public virtual void RemoveFriendship(RemoveFriendshipInput input)
{
  _friendshipRepository.Delete(input.Id);
}

 平常時(shí), 你不會(huì)需要這么做,這是因?yàn)閼?yīng)用服務(wù)的方法都應(yīng)該是單元性且通常是使用數(shù)據(jù)庫(kù)。在有些情況下,你或許會(huì)想要禁用應(yīng)用服務(wù)的工作單元:

(1)你的方法不需要任何數(shù)據(jù)庫(kù)操作且你不想要開啟那些不需要的數(shù)據(jù)庫(kù)連接
(2)你想要使用工作單元于UnitOfWorkScope類的有限范圍內(nèi),如上所述
注意,如果工作單元方法調(diào)用這個(gè)RemoveFriendship方法,禁用被忽略且它和調(diào)用它的方法使用同一個(gè)工作單元。因此,使用禁用這個(gè)功能要很小心。同樣地,上述程序代碼工作的很好,因?yàn)閭}(cāng)儲(chǔ)方法默認(rèn)即為工作單元。

2.無事務(wù)的工作單元(Non-transactional unit of work)

工作單元默認(rèn)上是具事務(wù)性的(這是它的天性)。因此,ABP啟動(dòng)/提交/回滾一個(gè)顯性的數(shù)據(jù)庫(kù)等級(jí)的事務(wù)。在有些特殊案例中,事務(wù)可能會(huì)導(dǎo)致問題,因?yàn)樗赡軙?huì)鎖住有些數(shù)據(jù)列或是數(shù)據(jù)表于數(shù)據(jù)庫(kù)中。在此這些情境下, 你或許會(huì)想要禁用數(shù)據(jù)庫(kù)等級(jí)的事務(wù)。UnitOfWork屬性可以從它的建構(gòu)子中取得一個(gè)布爾值來讓它如非事務(wù)型工作單元般工作著。示例為:

 [UnitOfWork(false)]
public GetTasksOutput GetTasks(GetTasksInput input)
{
  var tasks = _taskRepository.GetAllWithPeople(input.AssignedPersonId, input.State);
  return new GetTasksOutput
      {
        Tasks = Mapper.MapListTaskDto>>(tasks)
      };
}

建議可以這么做[UnitOfWork(isTransaction:false)]。(具有可讀性并且明確)。

注意,ORM框架(像是NHibernate和EntityFramework)會(huì)在單一命令中于內(nèi)部進(jìn)行數(shù)據(jù)儲(chǔ)存。假設(shè)你更新了一些的實(shí)體于非事務(wù)的UoW。即便于這個(gè)情境下所有的更新都會(huì)于單一數(shù)據(jù)庫(kù)命令的工作單元尾部完成。但是,如果你直接執(zhí)行SQL查詢,它會(huì)立即被執(zhí)行。

這里有一個(gè)非事務(wù)性UoW的限制。如果你已經(jīng)位于事務(wù)性UoW區(qū)域內(nèi),設(shè)定isTransactional為false這個(gè)動(dòng)作會(huì)被忽略。

使用非事務(wù)性UoW要小心,因?yàn)樵诖蠖鄶?shù)的情況下,數(shù)據(jù)整合應(yīng)該是具事務(wù)性的。如果你的方法只是讀取數(shù)據(jù),不改變數(shù)據(jù),那么當(dāng)然可以采用非事務(wù)性。

3.工作單元調(diào)用其它工作單元(A unit of work method calls another)

若工作單元方法(一個(gè)貼上UnitOfWork屬性標(biāo)簽的方法)調(diào)用另一個(gè)工作單元方法,他們共享同一個(gè)連接和事務(wù)。第一個(gè)方法管理連接,其它的方法只是使用它。這在所有方法都執(zhí)行在同一個(gè)線程下是可行的(或是在同一個(gè)Web請(qǐng)求內(nèi))。實(shí)際上,當(dāng)工作單元區(qū)域開始,所有的程序代碼都會(huì)在同一個(gè)線程中執(zhí)行并共享同一個(gè)連接事務(wù),直到工作單元區(qū)域終止。這對(duì)于使用UnitOfWork屬性和UnitOfWorkScope類來說都是一樣的。如果你創(chuàng)建了一個(gè)不同的線程/任務(wù),它使用自己所屬的工作單元。

自動(dòng)化的saving changes (Automatically saving changes)

當(dāng)我們使用工作單元到方法上,ABP自動(dòng)的儲(chǔ)存所有變化于方法的末端。假設(shè)我們需要一個(gè)可更新person名稱的方法:

 [UnitOfWork]
  public void UpdateName(UpdateNameInput input) {
   var person = _personRepository.Get(input.PersonId);
   person.Name = input.NewName;
  }

就這樣,名稱就被修改了!我們甚至沒有調(diào)用_personRepository.Update方法。ORM框架會(huì)持續(xù)追蹤實(shí)體所有的變化于工作單元內(nèi),且反映所有變化到數(shù)據(jù)庫(kù)中。

注意,這不需要在應(yīng)用服務(wù)聲明UnitOfWork,因?yàn)樗鼈兡J(rèn)就是采用工作單元。

4.倉(cāng)儲(chǔ)接口的GetAll()方法(IRepository.GetAll())

當(dāng)你在倉(cāng)儲(chǔ)方法外調(diào)用GetAll方法, 這必定得有一個(gè)開啟狀態(tài)的數(shù)據(jù)庫(kù)連接,因?yàn)樗祷豂Queryable類型的對(duì)象。這是需要的,因?yàn)镮Queryable延遲執(zhí)行。它并不會(huì)馬上執(zhí)行數(shù)據(jù)庫(kù)查詢,直到你調(diào)用ToList()方法或在foreach循環(huán)中使用IQueryable(或是存取被查詢結(jié)果集的情況下)。因此,當(dāng)你調(diào)用ToList()方法,數(shù)據(jù)庫(kù)連接必需是啟用狀態(tài)。示例:

[UnitOfWork]
public SearchPeopleOutput SearchPeople(SearchPeopleInput input)
{
  //Get IQueryablePerson>
  var query = _personRepository.GetAll();

  //Add some filters if selected
  if (!string.IsNullOrEmpty(input.SearchedName))
  {
    query = query.Where(person => person.Name.StartsWith(input.SearchedName));
  }

  if (input.IsActive.HasValue)
  {
    query = query.Where(person => person.IsActive == input.IsActive.Value);
  }

  //Get paged result list
  var people = query.Skip(input.SkipCount).Take(input.MaxResultCount).ToList();

  return new SearchPeopleOutput { People = Mapper.MapListPersonDto>>(people) };
}

在這里,SearchPeople方法必需是工作單元,因?yàn)镮Queryable在被調(diào)用ToList()方法于方法本體內(nèi),并且數(shù)據(jù)庫(kù)連接必須于IQueryable.ToList()被執(zhí)行時(shí)開啟。

一如GetAll()方法,如果需要數(shù)據(jù)庫(kù)連接且沒有倉(cāng)儲(chǔ)的情況下,你就必須要使用工作單元。注意,應(yīng)用服務(wù)方法默認(rèn)就是工作單元。

5.工作單元屬性的限制(UnitOfWork attribute restrictions)

在下面情境下你可以使用UnitOfWork屬性標(biāo)簽:

(1)類所有public或public virtual這些基于界面的方法(像是應(yīng)用服務(wù)是基于服務(wù)界面)
(2)自我注入類的public virtual方法(像是MVC Controller和Web API Controller)
(3)所有protected virtual方法。
建議將方法標(biāo)示為virtual。你無法應(yīng)用在private方法上。因?yàn)?ABP使用dynamic proxy來實(shí)現(xiàn),而私有方法就無法使用繼承的方法來實(shí)現(xiàn)。當(dāng)你不使用依賴注入且自行初始化類,那么UnitOfWork屬性(以及任何代理)就無法正常運(yùn)作。

選項(xiàng)
有許多可以用來控制工作單元的選項(xiàng)。

首先,我們可以在startup configuration中改變所有工作單元的所有默認(rèn)值。這通常是用了我們模塊中的PreInitialize方法來實(shí)現(xiàn)。

 

public class SimpleTaskSystemCoreModule : AbpModule
{
  public override void PreInitialize()
  {
    Configuration.UnitOfWork.IsolationLevel = IsolationLevel.ReadCommitted;
    Configuration.UnitOfWork.Timeout = TimeSpan.FromMinutes(30);
  }

  //...other module methods
}

方法
工作單元系統(tǒng)運(yùn)作是無縫且不可視的。但是,在有些特例下,你需要調(diào)用它的方法。

SaveChanges:

ABP儲(chǔ)存所有的變化于工作單元的尾端,你不需要做任何事情。但是,有些時(shí)候,你或許會(huì)想要在工作單元的過程中就儲(chǔ)存所有變化。在這個(gè)案例中,你可以注入IUnitOfWorkManager并且調(diào)用IUnitOfWorkManager.Current.SaveChanges()方法。示例中以Entity Framework在儲(chǔ)存變化時(shí)取得新增實(shí)體的Id。注意,當(dāng)前工作單元是具事務(wù)性的,所有在事務(wù)中的變化會(huì)在異常發(fā)生時(shí)都被回滾,即便是已調(diào)用SaveChange。

事件
工作單元具有Completed/Failed/Disposed事件。你可以注冊(cè)這些事件并且進(jìn)行所需的操作。注入IUnitOfWorkManager并且使用IUnitOfWorkManager.Current 屬性來取得當(dāng)前已激活的工作單元并且注冊(cè)它的事件。

你或許會(huì)想要執(zhí)行有些程序代碼于當(dāng)前工作單元成功地完成。示例:

 

public void CreateTask(CreateTaskInput input)
{
  var task = new Task { Description = input.Description };

  if (input.AssignedPersonId.HasValue)
  {
    task.AssignedPersonId = input.AssignedPersonId.Value;

    _unitOfWorkManager.Current.Completed += (sender, args) => { /* TODO: Send email to assigned person */ };
  }

  _taskRepository.Insert(task);
}

您可能感興趣的文章:
  • 解析ABP框架中的數(shù)據(jù)傳輸對(duì)象與應(yīng)用服務(wù)
  • ABP框架中的日志功能完全解析
  • 詳解ABP框架的參數(shù)有效性驗(yàn)證和權(quán)限驗(yàn)證
  • 詳解ABP框架中領(lǐng)域?qū)拥念I(lǐng)域事件Domain events
  • 詳解ABP框架中的數(shù)據(jù)過濾器與數(shù)據(jù)傳輸對(duì)象的使用
  • 解析ABP框架領(lǐng)域?qū)又械膶?shí)體類與倉(cāng)儲(chǔ)類
  • 詳解ABP框架中Session功能的使用方法
  • 詳解ABP框架中的日志管理和設(shè)置管理的基本配置
  • ABP框架的基礎(chǔ)配置及依賴注入講解
  • ABP框架的體系結(jié)構(gòu)及模塊系統(tǒng)講解
  • ASP.NET樣板項(xiàng)目ABP框架的特性總結(jié)
  • 基于ASP.NET MVC的ABP框架入門學(xué)習(xí)教程
  • ABP框架中導(dǎo)航菜單的使用及JavaScript API獲取菜單的方法

標(biāo)簽:慶陽 臨夏 甘肅 中衛(wèi) 海西 聊城 清遠(yuǎn)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《解析ABP框架中的事務(wù)處理和工作單元》,本文關(guān)鍵詞  解析,ABP,框架,中的,事務(wù)處理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《解析ABP框架中的事務(wù)處理和工作單元》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于解析ABP框架中的事務(wù)處理和工作單元的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美日韩黄色影视| 在线观看免费亚洲| 懂色av中文字幕一区二区三区| 欧美日韩精品久久久| 一区二区三区免费在线观看| 色视频一区二区| 亚洲免费资源在线播放| 97se亚洲国产综合自在线观| 亚洲欧美一区二区久久 | 色哟哟亚洲精品| 一区二区三区日韩欧美精品| 欧美亚洲图片小说| 日韩和的一区二区| 日韩精品专区在线影院观看| 国产精品一二三四| 一区二区激情视频| 日韩女同互慰一区二区| 狠狠狠色丁香婷婷综合激情 | 一区二区三区欧美在线观看| 欧美三级中文字幕在线观看| 麻豆视频一区二区| 亚洲视频免费看| 欧美巨大另类极品videosbest| 精品在线亚洲视频| 亚洲精品视频一区| 欧美一区二区日韩一区二区| 国产凹凸在线观看一区二区| 一区二区三区av电影| 精品国产一区二区三区av性色 | 国产在线看一区| 一区二区三区资源| 精品福利av导航| 在线欧美日韩国产| 国产成人一区二区精品非洲| 性做久久久久久免费观看| 国产欧美精品区一区二区三区| 色av成人天堂桃色av| 狠狠久久亚洲欧美| 午夜私人影院久久久久| 亚洲色图视频网站| 久久综合视频网| 日韩精品一区二区三区视频在线观看| 色悠悠久久综合| zzijzzij亚洲日本少妇熟睡| 国产一区二区在线影院| 亚洲高清在线精品| 亚洲欧洲国产日本综合| 欧美—级在线免费片| 26uuu欧美日本| 精品国产精品一区二区夜夜嗨| 欧美日韩一区二区三区免费看 | 在线欧美日韩国产| 黄一区二区三区| 久久国产日韩欧美精品| 亚洲欧洲日韩综合一区二区| 精品国产欧美一区二区| 欧美精品在线观看播放| 色吧成人激情小说| 99vv1com这只有精品| 国产一区二区不卡老阿姨| 日韩高清在线电影| 亚洲综合成人在线| 国产精品美女久久久久高潮| 欧美本精品男人aⅴ天堂| 欧美成人r级一区二区三区| 欧美日韩一二三区| 欧美精品欧美精品系列| 欧美日韩在线免费视频| 欧美精品丝袜久久久中文字幕| 91在线观看视频| 欧美一区二区三区四区视频| 色一情一乱一乱一91av| 成人精品免费网站| 亚洲一区二区三区中文字幕 | 亚洲一线二线三线视频| 亚洲精品一二三| 最新欧美精品一区二区三区| 国产午夜亚洲精品不卡| 国产欧美久久久精品影院| 欧美日韩亚洲综合在线| 97超碰欧美中文字幕| 久久久久国产精品麻豆ai换脸 | 99久久精品情趣| 久久精品国产亚洲高清剧情介绍| 亚洲色图.com| 国产欧美日韩麻豆91| 日韩欧美一区二区三区在线| 欧美精品免费视频| 国产精品一区二区免费不卡| 中文字幕精品—区二区四季| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 国产成a人亚洲精品| 成人免费毛片高清视频| caoporn国产精品| 99re这里只有精品首页| 91高清在线观看| 日韩一级二级三级精品视频| 欧美一级专区免费大片| 欧美韩国一区二区| 亚洲丝袜美腿综合| 爽好久久久欧美精品| 91美女片黄在线| 欧美一区二区三区视频免费播放| 久久久影院官网| 一区二区三区四区视频精品免费| 天涯成人国产亚洲精品一区av| 精品亚洲国内自在自线福利| 日本电影欧美片| 欧美变态tickle挠乳网站| 亚洲韩国精品一区| 激情综合色综合久久| 成人蜜臀av电影| 91精品国产综合久久久久久| 亚洲免费三区一区二区| 国产激情视频一区二区在线观看| 91网站在线观看视频| 国产蜜臀av在线一区二区三区| 日日嗨av一区二区三区四区| 成人av集中营| 91在线看国产| 亚洲黄一区二区三区| 欧美精品xxxxbbbb| 久久久www免费人成精品| 亚洲免费av高清| 欧美日韩亚洲不卡| 国产精品乱码一区二区三区软件| 午夜精品一区二区三区三上悠亚| 成人黄色免费短视频| 国产丝袜在线精品| 国产mv日韩mv欧美| 国产精品久久影院| www..com久久爱| 亚洲女同女同女同女同女同69| 亚洲综合色区另类av| 在线看一区二区| 日韩二区在线观看| 777精品伊人久久久久大香线蕉| 三级久久三级久久久| 日韩欧美视频在线| 国产成人精品免费网站| 国产视频一区在线播放| 99精品视频在线观看免费| 香蕉影视欧美成人| 国产婷婷色一区二区三区在线| 大胆亚洲人体视频| 日韩av网站免费在线| 国产精品成人网| 欧美xxxx老人做受| 亚洲欧洲韩国日本视频| 亚洲国产va精品久久久不卡综合| 一本久久精品一区二区| 午夜电影一区二区三区| 欧美日韩aaa| 91蜜桃网址入口| 男女性色大片免费观看一区二区| 国产精品美女久久久久av爽李琼| 欧美在线不卡一区| 亚洲成人三级小说| 欧美mv和日韩mv的网站| 在线视频一区二区三区| 韩国三级中文字幕hd久久精品| 亚洲女人小视频在线观看| 久久久精品综合| 精品伦理精品一区| 欧美成人在线直播| 91麻豆精品国产91久久久资源速度 | 国产精品一区在线观看乱码 | 色婷婷综合久久久久中文一区二区| 天堂成人国产精品一区| 久99久精品视频免费观看| 美女一区二区在线观看| 中文字幕的久久| 亚洲色图制服诱惑 | 欧美国产国产综合| 国产午夜精品在线观看| 国产精品免费视频网站| 国产精品美女久久久久久2018| 欧美激情综合在线| 一区二区久久久| 日本欧美一区二区三区| 青青草97国产精品免费观看 | 欧美午夜精品一区二区三区| 国内精品写真在线观看 | 国产成人av一区二区三区在线 | 国产亚洲一区二区三区| 亚洲一区二区三区在线看| 老司机精品视频线观看86| 91丨porny丨户外露出| 欧美一区二区视频观看视频| 欧美日韩国产高清一区二区| 一区二区欧美在线观看| 国内欧美视频一区二区| 亚洲欧美日韩在线| 久久99国内精品| 欧美日韩国产一区| 欧美高清在线一区二区| 日韩电影在线一区| 欧美三级视频在线观看| 国产精品久久久久久久久免费相片| 亚洲国产欧美一区二区三区丁香婷|