中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

ABP框架的基礎配置及依賴注入講解
來源:易賢網 閱讀:1698 次 日期:2016-08-08 13:46:58
溫馨提示:易賢網小編為您整理了“ABP框架的基礎配置及依賴注入講解”,方便廣大網友查閱!

這篇文章主要介紹了ABP框架的基礎配置及依賴注入講解,是ABP框架上手使用的基本,要的朋友可以參考下

配置ABP

配置是通過在自己模塊的PreInitialize方法中來實現的

代碼示例如下:

public class SimpleTaskSystemModule : AbpModule

{

  public override void PreInitialize()

  {

    //在你的應用中添加語言包,這個是英語和作者的土耳其語。

    Configuration.Localization.Languages.Add(new LanguageInfo("en", "English", "famfamfam-flag-england", true));

    Configuration.Localization.Languages.Add(new LanguageInfo("tr", "Türkçe", "famfamfam-flag-tr"));

    Configuration.Localization.Sources.Add(

      new XmlLocalizationSource(

        "SimpleTaskSystem",

        HttpContext.Current.Server.MapPath("~/Localization/SimpleTaskSystem")

        )

      );

    //配置導航和菜單

    Configuration.Navigation.Providers.Add<SimpleTaskSystemNavigationProvider>();

  }

  public override void Initialize()

  {

    IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());

  }

}

和orchard類似,abp框架一開始就被設計成模塊化的,不同的模塊可以通過abp框架來進行配置。舉個例子吧,不同的模塊都可以添加導航,通過導航添加菜單項到自己定義的主菜單,具體的細節大家可以參照:

本地化:http://www.aspnetboilerplate.com/Pages/Documents/Localization

導航:http://www.aspnetboilerplate.com/Pages/Documents/Navigation

配置模塊

和.net框架原生的啟動配置相比較,abp有哪些不一樣呢?abp框架的模塊可以通過IAbpModuleConfigurations接口進行個性化的擴展,這樣的話,模塊配置更加簡單、方便。

示例代碼如下:

...

using Abp.Web.Configuration;

...

public override void PreInitialize() 

{

  Configuration.Modules.AbpWeb().SendAllExceptionsToClients = true;

}

...

在上面這個例子中,我們通過配置AbpWeb模塊,發送異常到客戶端。當然了,不是每一個模塊都需要這種配置,通常情況下我們需要,是當一個模塊需要在多個不同的應用中重復使用,我們才進行這樣的配置。

為一個模塊創建配置

如下代碼,假如我們有一個命名為MyModule的模塊,并且這各模塊有一些自己的配置。那么我們首先要創建一些類,這些類定義為屬性(譯者注:屬性有自動的get和set訪問器。),代表了不同的配置。

public class MyModuleConfig

{

  public bool SampleConfig1 { get; set; }

  public string SampleConfig2 { get; set; }

}

接下來,我們通過依賴注入,注冊這個類。

IocManager.Register<MyModuleConfig>(); //譯者注:在IocManager中注冊了一個類,換句話說,我們通過IocManager可以得到這個類MyModuleConfig的實例。至于IOC的原理這里就不在詳細說了,總之,就是可以得到一個類的實例。

最后,我們通過創建一個擴展的方法IModuleConfigurations來得到配置的引用。如下代碼:

2016615173022790.png (920×215)

譯者注:模塊配置是一個靜態類,因為我們需要重復使用它。靜態方法Mymodule返回的是一個配置接口,參數是ImoduleConfigurations接口。

現在,在其他模塊中也可以配置我們自定義的這個MyModule模塊了。

Configuration.Modules.MyModule().SampleConfig1 = false;

Configuration.Modules.MyModule().SampleConfig2 = "test";

在某種意義上,MyModule需要這些配置,你能注射MyModuleConfig并且可以使用這些值。

public class MyService : ITransientDependency

{

  private readonly MyModuleConfig _configuration;

  public MyService(MyModuleConfig configuration)

  {

    _configuration = configuration;

  }

  public void DoIt()

  {

    if (_configuration.SampleConfig2 == "test")

    {

      //...

    }

  }

}

這意味著,在abp框架的系統中,所有的模塊都可以集中配置。

ABP依賴注入

什么是依賴注入

如果你已經知道依賴注入的概念,構造函數和屬性注入模式,你可以跳過這一節。

維基百科說:“依賴注入是一種軟件設計模式的一個或多個依賴項注入(或服務),或通過引用傳遞,為依賴對象(或客戶)和客戶端狀態的一部分。模式之間建立一個客戶的依賴關系的行為,它允許程序設計是松散耦合的,依賴倒置和單一職責原則。它直接對比service locator模式,它允許客戶了解他們所使用的系統找到依賴。”。

如果不使用依賴注入技術,很難進行依賴管理、模塊化開發和應用程序模塊化。

傳統方式的問題

在一個應用程序中,類之間相互依賴。假設我們有一個應用程序服務,使用倉儲(repository)類插入實體到數據庫。在這種情況下,應用程序服務類依賴于倉儲(repository)類。看下例子:

public class PersonAppService

{

  private IPersonRepository _personRepository;

  public PersonAppService()

  {

    _personRepository = new PersonRepository();      

  }

  public void CreatePerson(string name, int age)

  {

    var person = new Person { Name = name, Age = age };

    _personRepository.Insert(person);

  }

}

PersonAppService使用PersonRepository插入Person到數據庫。這段代碼的問題:

PersonAppService通過IPersonRepository調用CreatePerson方法,所以這方法依賴于IPersonRepository,代替了PersonRepository具體類。但PersonAppService(的構造函數)仍然依賴于PersonRepository。組件應該依賴于接口而不是實現。這就是所謂的依賴性倒置原則。

如果PersonAppService創建PersonRepository本身,它成為依賴IPersonRepository接口的具體實現,不能使用另一個實現。因此,此方式的將接口與實現分離變得毫無意義。硬依賴(hard-dependency)使得代碼緊密耦合和較低的可重用。

我們可能需要在未來改變創建PersonRepository的方式。即,我們可能想讓它創建為單例(單一共享實例而不是為每個使用創建一個對象)。或者我們可能想要創建多個類實現IPersonRepository并根據條件創建對象。在這種情況下,我們需要修改所有依賴于IPersonRepository的類。

有了這樣的依賴,很難(或不可能)對PersonAppService進行單元測試。

為了克服這些問題,可以使用工廠模式。因此,創建的倉儲類是抽象的。看下面的代碼:

public class PersonAppService

{

  private IPersonRepository _personRepository;

  public PersonAppService()

  {

    _personRepository = PersonRepositoryFactory.Create();      

  }

  public void CreatePerson(string name, int age)

  {

    var person = new Person { Name = name, Age = age };

    _personRepository.Insert(person);

  }

}

PersonRepositoryFactory是一個靜態類,創建并返回一個IPersonRepository。這就是所謂的服務定位器模式。以上依賴問題得到解決,因為PersonAppService不需要創建一個IPersonRepository的實現的對象,這個對象取決于PersonRepositoryFactory的Create方法。但是,仍然存在一些問題:

此時,PersonAppService取決于PersonRepositoryFactory。這是更容易接受,但仍有一個硬依賴(hard-dependency)。

為每個庫或每個依賴項乏味的寫一個工廠類/方法。

測試性依然不好,由于很難使得PersonAppService使用mock實現IPersonRepository。

解決方案:

有一些最佳實踐(模式)用于類依賴。

構造函數注入

重寫上面的例子,如下所示:

public class PersonAppService

 {

   private IPersonRepository _personRepository;

   public PersonAppService(IPersonRepository personRepository)

   {

     _personRepository = personRepository;

   }

   public void CreatePerson(string name, int age)

   {

     var person = new Person { Name = name, Age = age };

     _personRepository.Insert(person);

   }

 }

這被稱為構造函數注入。現在,PersonAppService不知道哪些類實現IPersonRepository以及如何創建它。誰需要使用PersonAppService,首先創建一個IPersonRepository PersonAppService并將其傳遞給構造函數,如下所示:

var repository = new PersonRepository();

var personService = new PersonAppService(repository);

personService.CreatePerson("Yunus Emre", 19);

構造函數注入是一個完美的方法,使一個類獨立創建依賴對象。但是,上面的代碼有一些問題:

創建一個PersonAppService變得困難。想想如果它有4個依賴,我們必須創建這四個依賴對象,并將它們傳遞到構造函數PersonAppService。

從屬類可能有其他依賴項(在這里,PersonRepository可能有依賴關系)。所以,我們必須創建PersonAppService的所有依賴項,所有依賴項的依賴關系等等. .如此,依賴關系使得我們創建一個對象變得過于復雜了。

幸運的是,依賴注入框架自動化管理依賴關系。

屬性注入

構造函數注入模式是一個完美的提供類的依賴關系的方式。通過這種方式,您不能創建類的實例,而不提供依賴項。它也是一個強大的方式顯式地聲明是什么類的需求正確地工作。

但是,在某些情況下,該類依賴于另一個類,但也可以沒有它。這通常是適用于橫切關注點(如日志記錄)。一個類可以沒有工作日志,但它可以寫日志如果你提供一個日志對象。在這種情況下,您可以定義依賴為公共屬性,而不是讓他們放在構造函數。想想,如果我們想在PersonAppService寫日志。我們可以重寫類如下: 

public class PersonAppService

  {

    public ILogger Logger { get; set; }

    private IPersonRepository _personRepository;

    public PersonAppService(IPersonRepository personRepository)

    {

      _personRepository = personRepository;

      Logger = NullLogger.Instance;

    }

    public void CreatePerson(string name, int age)

    {

      Logger.Debug("Inserting a new person to database with name = " + name);

      var person = new Person { Name = name, Age = age };

      _personRepository.Insert(person);

      Logger.Debug("Successfully inserted!");

    }

  }

NullLogger.Instance 是一個單例對象,實現了ILogger接口,但實際上什么都沒做(不寫日志。它實現了ILogger實例,且方法體為空)。現在,PersonAppService可以寫日志了,如果你為PersonAppService實例設置了Logger,如下面:

var personService = new PersonAppService(new PersonRepository());

personService.Logger = new Log4NetLogger();

personService.CreatePerson("Yunus Emre", 19);

假設Log4NetLogger實現ILogger實例,使得我們可以使用Log4Net庫寫日志。因此,PersonAppService可以寫日志。如果我們不設置Logger,PersonAppService就不寫日志。因此,我們可以說PersonAppService ILogger實例是一個可選的依賴。

幾乎所有的依賴注入框架都支持屬性注入模式

依賴注入框架

有許多依賴注入框架,都可以自動解決依賴關系。他們可以創建所有依賴項(遞歸地依賴和依賴關系)。所以你只需要根據注入模式寫類和類構造函數&屬性,其他的交給DI框架處理!在良好的應用程序中,類甚至獨立于DI框架。整個應用程序只會有幾行代碼或類,顯示的與DI框架交互。

ABP的依賴注入基于 Castle Windsor框架。Castle Windsor最成熟的DI框架之一。還有很多這樣的框架,如Unity,Ninject,StructureMap,Autofac等等。

在使用一個依賴注入框架時,首先注冊您的接口/類到依賴注入框架中,然后你就可以resolve一個對象。在Castle Windsor,它是這樣的:

var container = new WindsorContainer();

container.Register(

    Component.For<IPersonRepository>().ImplementedBy<PersonRepository>().LifestyleTransient(),

    Component.For<IPersonAppService>().ImplementedBy<PersonAppService>().LifestyleTransient()

  );

var personService = container.Resolve<IPersonAppService>();

personService.CreatePerson("Yunus Emre", 19);

我們首先創建了WindsorContainer。然后注冊PersonRepository 和 PersonAppService及它們的接口。然后我們要求容器創建一個IPersonAppService實例。它創建PersonAppService對象及其依賴項并返回。在這個簡單的示例中,使用DI框架也許不是那么簡潔,但想象下,在實際的企業應用程序中你會有很多類和依賴關系。當然,注冊的依賴項只在程序啟動的某個地方創建一次。

請注意,我們只是講對象聲明為臨時對象(transient)。這意味著每當我們創建這些類型的一個對象時,就會創建一個新的實例。有許多不同的生命周期(如Singletion)。

ABP依賴注入的基礎結構

在編寫應用程序時遵循最佳實踐和一些約定,ABP幾乎讓依賴注入框架使用變得無形。

注冊:

在ABP中,有很多種不同的方法來注冊你的類到依賴注入系統。大部分時間,常規方法就足夠了。

常規注冊:

按照約定,ABP自動注冊所有 Repositories, Domain Services, Application Services, MVC 控制器和Web API控制器。例如,您可能有一個IPersonAppService 接口和實現類PersonAppService:

public interface IPersonAppService : IApplicationService

{

  //...

}

public class PersonAppService : IPersonAppService

{

  //...

}

ABP會自動注冊它,因為它實現IApplicationService接口(它只是一個空的接口)。它會被注冊為transient (每次使用都創建實例)。當你注入(使用構造函數注入)IPersonAppService接口成一個類,PersonAppService對象會被自動創建并傳遞給構造函數。

命名約定在這里非常重要。例如你可以將名字PersonAppService改為 MyPersonAppService或另一個包含“PersonAppService”后綴的名稱,由于IPersonAppService包含這個后綴。但是你可以不遵循PeopleService命名您的服務類。如果你這樣做,它將不會為IPersonAppService自動注冊(它需要自注冊(self-registration)到DI框架,而不是接口),所以,如果你想要你應該手動注冊它。

ABP按照約定注冊程序集。所以,你應該告訴ABP按照約定注冊您的程序集。這很容易:

IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());

Assembly.GetExecutingAssembly()得到一個對包括此代碼的程序集的引用。你可以通過RegisterAssemblyByConvention方法注冊其他程序集。這同在你的模塊初始化(AbpModule.Initialize())時完成。請查看ABP的模塊系統獲得更多信息。

您可以通過實現IConventionalRegisterer接口和調用IocManager。AddConventionalRegisterer方法編寫自己的約定注冊類。你應該將它添加到模塊的pre-initialize方法中。

幫助接口

你可以注冊一個特定的類,不遵循傳統的約定制度規則。ABP提供了ITransientDependency和ISingletonDependency接口的快捷方法。例如:

public interface IPersonManager

{

  //...

}

public class MyPersonManager : IPersonManager, ISingletonDependency

{

  //...

}

以這種方式,您可以很容易地注冊MyPersonManager為transient。當需要注入IPersonManager時,MyPersonManager會被使用。注意,依賴被聲明為單例。因此,創建的MyPersonManager同一個對象被傳遞給所有需要的類。只是在第一次使用時創建,那么應用程序的整生命周期使用的是同一實例。

自定義/直接 注冊

如果之前描述的方法還是不足以應對你的情況,你可以使用Castle Windsor注冊類和及依賴項。因此,您將擁有Castle Windsor注冊的所有能力。

可以實現IWindsorInstaller接口進行注冊。您可以在應用程序中創建一個實現IWindsorInstaller接口的類:

public class MyInstaller : IWindsorInstaller

{

  public void Install(IWindsorContainer container, IConfigurationStore store)

  {

    container.Register(Classes.FromThisAssembly().BasedOn<IMySpecialInterface>().LifestylePerThread().WithServiceSelf());

  }

}

Abp自動發現和執行這個類。最后,你可以通過使用IIocManager.IocContainer屬性得到WindsorContainer。有關更多信息,閱讀Windsor的文檔。

解析(Resolving)

注冊通知IOC(控制反轉)容器關于你的類,它們的依賴項和生命周期。在您的應用程序需要使用IOC容器創建對象時,ASP.NET提供了一些方法解決依賴關系。

構造函數 & 屬性注入

作為最佳實踐,你可以使用構造函數和屬性注入去獲取你的類的依賴。任何可能的地方,你都應該這樣做。例子:

public class PersonAppService

{

  public ILogger Logger { get; set; }

  private IPersonRepository _personRepository;

  public PersonAppService(IPersonRepository personRepository)

  {

    _personRepository = personRepository;

    Logger = NullLogger.Instance;

  }

  public void CreatePerson(string name, int age)

  {

    Logger.Debug("Inserting a new person to database with name = " + name);

    var person = new Person { Name = name, Age = age };

    _personRepository.Insert(person);

    Logger.Debug("Successfully inserted!");

  }

}

IPersonRepository從構造函數注入,ILogger實例從公共屬性注入。這樣,您的代碼不會體現依賴注入系統。這是使用DI系統最適當的方式。

IIocResolver 和 IIocManager

有時你可能需要直接創建你的依賴項,而不是構造函數和屬性注入。應該盡可能避免這種情況,但它可能無法避免。Abp提供一些服務使得這樣的注入很容易實現。例子:

public class MySampleClass : ITransientDependency

 {

   private readonly IIocResolver _iocResolver;

   public MySampleClass(IIocResolver iocResolver)

   {

     _iocResolver = iocResolver;

   }

   public void DoIt()

   {

     //Resolving, using and releasing manually

     var personService1 = _iocResolver.Resolve<PersonAppService>();

     personService1.CreatePerson(new CreatePersonInput { Name = "Yunus", Surname = "Emre" });

     _iocResolver.Release(personService1);

     //Resolving and using in a safe way

     using (var personService2 = _iocResolver.ResolveAsDisposable<PersonAppService>())

     {

       personService2.Object.CreatePerson(new CreatePersonInput { Name = "Yunus", Surname = "Emre" });

     }

   }

 }

MySampleClass是一個應用程序的示例類。IIcResolver通過構造函數注入,然后用它來創建和釋放對象。有幾個解決方法的重載可以根據需要使用。Release方法用于釋放組件(對象)。如果你是手動創建一個對象,調用Release方法釋放對象非常重要。否則,您的應用程序會有內存泄漏問題。為了保證對象被釋放,盡可能使用ResolveAsDisposable(就像上面的例子所示)。它會在using代碼塊結束的時候自動調用Release方法。

如果你想直接使用IOC容器(Castle Windsor)來處理依賴關系項,可以通過構造函數注入 IIocManager并使用它IIocManager.IocContainer 屬性。如果你是在一個靜態上下文或不能注入IIocManager,還有最后一個方法,你可以使用單例對象IocManager.Instance,你可以在任何地方獲取到,它無處不在。但是,在這種情況下你的代碼將變得不易容測試。

附加

IShouldInitialize 接口:

有些類在第一次使用前需要初始化。IShouldInitialize有Initialize()方法。如果你實現它,那么你的Initialize()方法自動會被自動調用在創建對象之后(在使用之前)。當然,為了使用這個特性,你應該注入/創建此對象。

ASP.NET MVC & ASP.NET Web API 集成:

當然,我們必須調用依賴注入系統處理依賴關系圖的根對象。在一個ASP.NET MVC應用程序,通常是一個控制器類。我們可以使用構造函數注入模式注入控制器。當一個請求來到我們的應用程序中,控制器和所有依賴項被IOC容器遞歸創建。所以,誰做了這些?這是被Abp擴展的ASP.NET MVC默認控制器工廠自動完成的。ASP.NET Web API 也是相似的。你不用關心對象的創建和釋放。

更多信息請查看網絡編程
易賢網手機網站地址:ABP框架的基礎配置及依賴注入講解
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
亚洲国内精品| 亚洲精品永久免费| 樱花yy私人影院亚洲| 久久在线观看视频| 99re在线精品| 国产精品视频yy9099| 亚洲国产网站| 国产日韩专区| 亚洲精品日韩久久| 欧美一级大片在线观看| 欧美在线观看一区| 久久久久久色| 欧美日韩一本到| 黄色一区二区三区| 亚洲一区二区黄| 欧美激情亚洲综合一区| 国产性天天综合网| 一本一本大道香蕉久在线精品| 校园春色综合网| 欧美成在线视频| 欧美视频一区二区三区四区| 欧美日韩精品欧美日韩精品一| 欧美激情亚洲综合一区| 欧美日韩精品在线| 国产精品美女久久久久久久 | 日韩图片一区| 亚洲电影在线免费观看| 国产精品视频免费| 午夜精品一区二区在线观看| 免费观看成人www动漫视频| 在线精品一区二区| 老司机精品久久| 久久都是精品| 亚洲国产精品久久久久婷婷老年| 欧美第一黄网免费网站| 欧美日韩视频专区在线播放 | 国产欧美日韩另类一区| 永久久久久久| 久久综合婷婷| 久久成人18免费观看| 欧美三区美女| 欧美视频在线免费| 麻豆freexxxx性91精品| 欧美在线国产精品| 国产精品视频久久| 欧美专区在线观看一区| 欧美视频1区| 羞羞色国产精品| 国产日韩欧美日韩| 欧美日一区二区在线观看| 欧美区视频在线观看| 午夜精品网站| 欧美在线观看视频在线| 欧美在线观看日本一区| 在线观看91久久久久久| 欧美精品久久一区| 亚洲素人一区二区| 亚洲人精品午夜| 国内精品国产成人| 韩国av一区二区三区在线观看| 国产精品videosex极品| 欧美日韩午夜| 亚洲一区二区成人| 亚洲高清免费视频| 亚洲欧美日韩在线| 欧美精品福利在线| 国产精品看片你懂得| 国产精品丝袜91| 亚洲免费观看高清在线观看 | 欧美96在线丨欧| 先锋影音国产精品| 亚洲新中文字幕| 欧美一区=区| 午夜精品视频网站| 羞羞答答国产精品www一本| 亚洲综合视频1区| 午夜精品剧场| 噜噜噜91成人网| 欧美国产精品一区| 欧美日韩伦理在线| 国产色综合网| 日韩视频在线观看免费| 亚洲精品欧美专区| 欧美精品一卡二卡| 国产农村妇女精品一二区| 亚洲国产高潮在线观看| 洋洋av久久久久久久一区| 久久成人人人人精品欧| 欧美午夜在线一二页| 欧美精品粉嫩高潮一区二区 | 99精品国产99久久久久久福利| 久久se精品一区二区| 久久亚洲一区二区三区四区| 国模套图日韩精品一区二区| 欧美午夜一区二区三区免费大片 | 亚洲欧美另类在线| 激情欧美丁香| 久久综合九色九九| 欧美日韩国产亚洲一区 | 午夜精品久久| 国产精品久久久久av免费| 国产一区在线看| 国产自产2019最新不卡| 久久精视频免费在线久久完整在线看| 亚洲国产精品视频| 极品尤物久久久av免费看| 久久精品免费播放| 亚洲欧洲日本mm| 亚洲大片av| 国产精品久久夜| 欧美激情影院| 欧美 日韩 国产 一区| 欧美一区二区三区另类 | 欧美成人中文字幕| 欲色影视综合吧| 亚洲精品免费一区二区三区| 国产一区二区三区黄| 欧美性感一类影片在线播放 | 国产精品国产三级国产a| 中文在线不卡视频| 亚洲嫩草精品久久| 欧美在线视频观看免费网站| 91久久精品一区二区别| 久久国产天堂福利天堂| 久久亚洲电影| 欧美激情精品久久久六区热门 | 欧美影视一区| 欧美高清视频一区二区三区在线观看| 亚洲国产一区二区视频| 欧美日韩亚洲视频一区| 亚洲成人原创| 嫩草影视亚洲| 国产欧美高清| 在线看国产一区| 国产精品久久一卡二卡| 久久久久久久综合| 亚洲天堂激情| 亚洲精品久久久久久久久久久久| 欧美日韩精品免费看| 久久久久久久综合| 亚洲一级网站| 亚洲精品久久| 在线亚洲观看| 亚洲国产欧美国产综合一区| 国产日韩在线不卡| 久久中文在线| 亚洲视频中文字幕| 亚洲欧美国产制服动漫| 亚洲欧洲综合另类| 国语自产在线不卡| 欧美jjzz| 国产精品video| 国产精品99免费看| 欧美日韩一区二区在线播放| 久久亚洲国产成人| 久久一区免费| 欧美高清不卡在线| 亚洲欧美日韩在线观看a三区| 亚洲精品国产视频| 亚洲精选久久| 亚洲欧美日韩在线| 欧美一区视频| 欧美在线不卡视频| 国产精品入口66mio| 国产日韩欧美精品一区| 一色屋精品视频在线观看网站| 国产在线成人| 日韩亚洲一区二区| 亚洲校园激情| 久久琪琪电影院| 欧美体内she精视频| 国产一区二区| 国产一区二区三区直播精品电影 | 亚洲茄子视频| 最近中文字幕日韩精品| 亚洲国产一区二区三区青草影视| av成人福利| 久久久精品五月天| 午夜精品美女久久久久av福利| 免费看成人av| 国产亚洲欧美一区二区三区| 欧美日韩在线另类| 尤物精品在线| 久久精品成人一区二区三区| 久久性色av| 国产亚洲一区二区在线观看| 亚洲人成网站精品片在线观看| 亚洲免费影视| 女女同性精品视频| 国产在线乱码一区二区三区| 在线综合亚洲| 久久精品国亚洲| 99精品国产热久久91蜜凸| 久久一二三国产| 国内外成人免费激情在线视频| 亚洲欧美国产高清| 欧美午夜在线观看| 在线观看视频日韩| 国产精品日韩一区二区三区| 亚洲人精品午夜|