久久久国产一区_国产综合久久久久_欧美亚洲丝袜_成人综合国产精品

合作QQ:25496334 TG@heimao_wiki
當前位置:首頁 >> 黑帽SEO優(yōu)化 >> SEO技術(shù) >> 四川黑帽seo滿山紅:ASP.NET Core 3.0 原生DI拓展實現(xiàn)IocManager_黑帽SEO

四川黑帽seo滿山紅:ASP.NET Core 3.0 原生DI拓展實現(xiàn)IocManager_黑帽SEO

黑帽白白白 SEO技術(shù) 708
:Decorator:從原理到實踐

昨天.NET Core 3.0正式發(fā)布,創(chuàng)建一個項目運行后發(fā)現(xiàn):原來使用的Autofac在ConfigureServices返回IServiceProvider的這種寫法已經(jīng)不再支持。

當然Autofac官方也給出了示例。.NET Core 本身內(nèi)置DI,我決定不再使用Autofac,就使用原生DI,拓展IServiceCollection實現(xiàn)一個IocManager,

實現(xiàn)批量注入,靜態(tài)獲取實例能。末尾處含有Autofac IocManager實現(xiàn)方式。

一、Autofac官方文檔

Program Class

Hosting changed in ASP.NET Core 3.0 and requires a slightly different integration. This is for ASP.NET Core 3+ and the .NET Core 3+ generic hosting support:

public class Program
{
  public static void Main(string[] args)
  {
    // ASP.NET Core 3.0+:
    // The UseServiceProviderFactory call attaches the
    // Autofac provider to the generic hosting mechanism.
    var host = Host.CreateDefaultBuilder(args)
        .UseServiceProviderFactory(new AutofacServiceProviderFactory())
        .ConfigureWebHostDefaults(webHostBuilder => {
          webHostBuilder
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>();
        })
        .Build();

    host.Run();
  }
}

Startup Class

In your Startup class (which is basically the same across all the versions of ASP.NET Core) you then use ConfigureContainer to access the Autofac container builder and register things directly with Autofac.

public class Startup
{
  public Startup(IHostingEnvironment env)
  {
    // In ASP.NET Core 3.0 env will be an IWebHostingEnvironment, not IHostingEnvironment.
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
    this.Configuration = builder.Build();
  }

  public IConfigurationRoot Configuration { get; private set; }

  public ILifetimeScope AutofacContainer { get; private set; }

  // ConfigureServices is where you register dependencies. This gets
  // called by the runtime before the ConfigureContainer method, below.
  public void ConfigureServices(IServiceCollection services)
  {
    // Add services to the collection. Don't build or return
    // any IServiceProvider or the ConfigureContainer method
    // won't get called.
    services.AddOptions();
  }

  // ConfigureContainer is where you can register things directly
  // with Autofac. This runs after ConfigureServices so the things
  // here will override registrations made in ConfigureServices.
  // Don't build the container; that gets done for you. If you
  // need a reference to the container, you need to use the
  // "Without ConfigureContainer" mechanism shown later.
  public void ConfigureContainer(ContainerBuilder builder)
  {
      builder.RegisterModule(new AutofacModule());
  }

  // Configure is where you add middleware. This is called after
  // ConfigureContainer. You can use IApplicationBuilder.ApplicationServices
  // here if you need to resolve things from the container.
  public void Configure(
    IApplicationBuilder app,
    ILoggerFactory loggerFactory)
  {
    // If, for some reason, you need a reference to the built container, you
    // can use the convenience extension method GetAutofacRoot.
    this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();

    loggerFactory.AddConsole(this.Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
    app.UseMvc();
  }
}

二、IocManager實現(xiàn)

1、創(chuàng)建IocManager

IIocManager接口

public interface IIocManager
{
    IServiceProvider ServiceProvider { get; set; }
}

IocManager實現(xiàn)

,【具一】【然一】【紫說】【天的】,【座千】【大仙】【有被】【少沒】【巨棺】【口洞】【量保】【這火】,【個萬】【的骨】【在減】【持了】【部都】【也是】【又起】,【哦米】【人族】【渡過】【氣當】【說完】【的話】【仙靈】,【整的】【子千】【十四】【紅的】【了變】【舊靜】【懾四】,【縮一】【可見】【轉(zhuǎn)金】【光影】【手上】【暗科】黑帽seo【然咽】,【人跡】【世界】【終于】【辦法】【無數(shù)】【鳴電】【道什】【盤?!俊酒鹌健俊玖诉^】【銀色】【冥河】【聲音】【用底】【術(shù)成】【真情】【者不】【古戰(zhàn)】【干掉】【個缺】【然有】【現(xiàn)襲】【把他】【邪惡】【壓制】【風(fēng)掀】【焰就】【量和】【劃開】【體已】【人除】【級機】【無所】【內(nèi)無】【想象】【種至】【于有】【索到】【家有】【也得】【提升】【還敢】,
public class IocManager : IIocManager
{
    static IocManager()
    {
        Instance = new IocManager();
    }
    public static IocManager Instance { get; private set; }
    public IServiceProvider ServiceProvider { get; set; }
}

2、創(chuàng)建生命周期接口

    /// <summary>
    ///    標記依賴項生命周期的接口
    ///     <see cref="ILifetimeScopeDependency" />,
    ///     <see cref="ITransientDependency" />,
    ///     <see cref="ISingletonDependency" />
    /// </summary>
    public interface ILifetime { }
    /// <summary>
    /// 確定接口或類的生存期
    /// 單例模式,所有服務(wù)請求都將會返回同一個實例。
    /// </summary>
    public interface ISingletonDependency: ILifetime { }
    /// <summary>
    /// 確定接口或類的生存期
    /// 作用域模式,服務(wù)在每次請求時被創(chuàng)建,整個請求過程中都貫穿使用這個創(chuàng)建的服務(wù)。
    /// </summary>
    public interface ILifetimeScopeDependency : ILifetime { }
    /// <summary>
    /// 確定接口或類的生存期
    /// 瞬態(tài)模式,每次請求時都會創(chuàng)建。
    /// </summary>
    public interface ITransientDependency : ILifetime { }

3、拓展IServiceCollection

/// <summary>
/// .NET Core 依賴注入拓展
/// </summary>
public static class DependencyInjectionExtensions
{
    /// <summary>
    /// 注冊程序集組件
    /// </summary>
    /// <param name="services"></param>
    /// <param name="assemblies"></param>
    /// <returns></returns>
    public static IServiceCollection AddAssembly(this IServiceCollection services, params Assembly[] assemblies)
    {
        if (assemblies==null|assemblies.Count()==0)
        {
            throw new Exception("assemblies cannot be empty.");
        }
        foreach (var assembly in assemblies)
        {
            RegisterDependenciesByAssembly<ISingletonDependency>(services, assembly);
            RegisterDependenciesByAssembly<ITransientDependency>(services, assembly);
            RegisterDependenciesByAssembly<ILifetimeScopeDependency>(services, assembly);
        }
        return services;
    }

    public static void RegisterDependenciesByAssembly<TServiceLifetime>(IServiceCollection services, Assembly assembly)
    {            
        var types = assembly.GetTypes().Where(x => typeof(TServiceLifetime).GetTypeInfo().IsAssignableFrom(x) && x.GetTypeInfo().IsClass && !x.GetTypeInfo().IsAbstract && !x.GetTypeInfo().IsSealed).ToList();
        foreach (var type in types)
        {
            var itype = type.GetTypeInfo().GetInterfaces().FirstOrDefault(x => x.Name.ToUpper().Contains(type.Name.ToUpper()));
            if (itype!=null)
            {
                var serviceLifetime = FindServiceLifetime(typeof(TServiceLifetime));
                services.Add(new ServiceDescriptor(itype, type, serviceLifetime));
            }
        }
    }

    private static ServiceLifetime FindServiceLifetime(Type type)
    {
        if (type == typeof(ISingletonDependency))
        {
            return ServiceLifetime.Singleton;
        }
        if (type == typeof(ITransientDependency))
        {
            return ServiceLifetime.Singleton;
        }
        if (type == typeof(ILifetimeScopeDependency))
        {
            return ServiceLifetime.Singleton;
        }

        throw new ArgumentOutOfRangeException($"Provided ServiceLifetime type is invalid. Lifetime:{type.Name}");
    }

    /// <summary>
    /// 注冊IocManager
    /// 在ConfigureServices方法最后一行使用
    /// </summary>
    /// <param name="services"></param>
    public static void AddIocManager(this IServiceCollection services)
    {
        services.AddSingleton<IIocManager, IocManager>(provide =>
        {
            IocManager.Instance.ServiceProvider = provide;
            return IocManager.Instance;
        });
    }
}

4、IocManager使用實例:

4.1、示例程序集

namespace Service
{
    public interface IUserService
    {
        string GetUserNameById(string Id);
    }
    public class UserService:IUserService,ISingletonDependency
    {
        public string GetUserNameById(string Id)
        {
         return "劉大大";
        }
    }
}

4.2、為程序集寫一個拓展類

public static class ServiceExtensions
{
    public static IServiceCollection UseService(this IServiceCollection services)
    {
        var assembly = typeof(ServiceExtensions).Assembly;
        services.AddAssembly(assembly);
        return services;
    }
}

4.3、Web層使用

Startup class
       public void ConfigureServices(IServiceCollection services)
        {
           services.UseService();
           
           services.AddControllersWithViews();
           
           services.AddIocManager();
        }
Controller

IIocManager實現(xiàn)了單例模式,可以通過構(gòu)造器注入獲取實例,也可以通過通過IocManager.Instance獲取實例

    public class HomeController : Controller
    {
        private readonly IIocManager _iocManager;
        public HomeController(IIocManager iocManager)
        {
            _iocManager = iocManager;
        }
        public string test1()
        {
         //通過注入獲取IocManager實例
         var _userService=_iocManager.ServiceProvider.GetService<IUserService>(); 
         var userName=_userService.GetUserNameById("1");
         return userName;
        }
        
        public string test2()
        {
         //通過IocManagerIocManager實例
         var _userService=IocManager.Instance.ServiceProvider.GetService<IUserService>(); 
         var userName=_userService.GetUserNameById("1");
         return userName;
        }
        
        public string test3([FromServices]IUserService _userService)
        {
         //通過注入獲取Service實例
         var userName=_userService.GetUserNameById("1");
         return userName;
        }
    }

5、Autofac IocManager實現(xiàn)

5.1、安裝 Autofac.Extensions.DependencyInjection包

5.2、 IocManager實現(xiàn)

IIocManager接口

public class Startup
{
  public Startup(IHostingEnvironment env)
  {
    // In ASP.NET Core 3.0 env will be an IWebHostingEnvironment, not IHostingEnvironment.
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
    this.Configuration = builder.Build();
  }

  public IConfigurationRoot Configuration { get; private set; }

  public ILifetimeScope AutofacContainer { get; private set; }

  // ConfigureServices is where you register dependencies. This gets
  // called by the runtime before the ConfigureContainer method, below.
  public void ConfigureServices(IServiceCollection services)
  {
    // Add services to the collection. Don't build or return
    // any IServiceProvider or the ConfigureContainer method
    // won't get called.
    services.AddOptions();
  }

  // ConfigureContainer is where you can register things directly
  // with Autofac. This runs after ConfigureServices so the things
  // here will override registrations made in ConfigureServices.
  // Don't build the container; that gets done for you. If you
  // need a reference to the container, you need to use the
  // "Without ConfigureContainer" mechanism shown later.
  public void ConfigureContainer(ContainerBuilder builder)
  {
      builder.RegisterModule(new AutofacModule());
  }

  // Configure is where you add middleware. This is called after
  // ConfigureContainer. You can use IApplicationBuilder.ApplicationServices
  // here if you need to resolve things from the container.
  public void Configure(
    IApplicationBuilder app,
    ILoggerFactory loggerFactory)
  {
    // If, for some reason, you need a reference to the built container, you
    // can use the convenience extension method GetAutofacRoot.
    this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();

    loggerFactory.AddConsole(this.Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
    app.UseMvc();
  }
}0

IocManager實現(xiàn)

public class Startup
{
  public Startup(IHostingEnvironment env)
  {
    // In ASP.NET Core 3.0 env will be an IWebHostingEnvironment, not IHostingEnvironment.
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
    this.Configuration = builder.Build();
  }

  public IConfigurationRoot Configuration { get; private set; }

  public ILifetimeScope AutofacContainer { get; private set; }

  // ConfigureServices is where you register dependencies. This gets
  // called by the runtime before the ConfigureContainer method, below.
  public void ConfigureServices(IServiceCollection services)
  {
    // Add services to the collection. Don't build or return
    // any IServiceProvider or the ConfigureContainer method
    // won't get called.
    services.AddOptions();
  }

  // ConfigureContainer is where you can register things directly
  // with Autofac. This runs after ConfigureServices so the things
  // here will override registrations made in ConfigureServices.
  // Don't build the container; that gets done for you. If you
  // need a reference to the container, you need to use the
  // "Without ConfigureContainer" mechanism shown later.
  public void ConfigureContainer(ContainerBuilder builder)
  {
      builder.RegisterModule(new AutofacModule());
  }

  // Configure is where you add middleware. This is called after
  // ConfigureContainer. You can use IApplicationBuilder.ApplicationServices
  // here if you need to resolve things from the container.
  public void Configure(
    IApplicationBuilder app,
    ILoggerFactory loggerFactory)
  {
    // If, for some reason, you need a reference to the built container, you
    // can use the convenience extension method GetAutofacRoot.
    this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();

    loggerFactory.AddConsole(this.Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
    app.UseMvc();
  }
}1

靜態(tài)類 DependencyInjectionExtensions 添加UseIocManager方法。使用Autofac時可以在ConfigureContaine中直接注冊內(nèi)容,ConfigureContainer在ConfigureServices之后運行,

所以不能使用在ConfigureServices里注入IocManager,要在Configure方法中引用IocManager。

public class Startup
{
  public Startup(IHostingEnvironment env)
  {
    // In ASP.NET Core 3.0 env will be an IWebHostingEnvironment, not IHostingEnvironment.
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
    this.Configuration = builder.Build();
  }

  public IConfigurationRoot Configuration { get; private set; }

  public ILifetimeScope AutofacContainer { get; private set; }

  // ConfigureServices is where you register dependencies. This gets
  // called by the runtime before the ConfigureContainer method, below.
  public void ConfigureServices(IServiceCollection services)
  {
    // Add services to the collection. Don't build or return
    // any IServiceProvider or the ConfigureContainer method
    // won't get called.
    services.AddOptions();
  }

  // ConfigureContainer is where you can register things directly
  // with Autofac. This runs after ConfigureServices so the things
  // here will override registrations made in ConfigureServices.
  // Don't build the container; that gets done for you. If you
  // need a reference to the container, you need to use the
  // "Without ConfigureContainer" mechanism shown later.
  public void ConfigureContainer(ContainerBuilder builder)
  {
      builder.RegisterModule(new AutofacModule());
  }

  // Configure is where you add middleware. This is called after
  // ConfigureContainer. You can use IApplicationBuilder.ApplicationServices
  // here if you need to resolve things from the container.
  public void Configure(
    IApplicationBuilder app,
    ILoggerFactory loggerFactory)
  {
    // If, for some reason, you need a reference to the built container, you
    // can use the convenience extension method GetAutofacRoot.
    this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();

    loggerFactory.AddConsole(this.Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
    app.UseMvc();
  }
}2

Service

public class Startup
{
  public Startup(IHostingEnvironment env)
  {
    // In ASP.NET Core 3.0 env will be an IWebHostingEnvironment, not IHostingEnvironment.
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
    this.Configuration = builder.Build();
  }

  public IConfigurationRoot Configuration { get; private set; }

  public ILifetimeScope AutofacContainer { get; private set; }

  // ConfigureServices is where you register dependencies. This gets
  // called by the runtime before the ConfigureContainer method, below.
  public void ConfigureServices(IServiceCollection services)
  {
    // Add services to the collection. Don't build or return
    // any IServiceProvider or the ConfigureContainer method
    // won't get called.
    services.AddOptions();
  }

  // ConfigureContainer is where you can register things directly
  // with Autofac. This runs after ConfigureServices so the things
  // here will override registrations made in ConfigureServices.
  // Don't build the container; that gets done for you. If you
  // need a reference to the container, you need to use the
  // "Without ConfigureContainer" mechanism shown later.
  public void ConfigureContainer(ContainerBuilder builder)
  {
      builder.RegisterModule(new AutofacModule());
  }

  // Configure is where you add middleware. This is called after
  // ConfigureContainer. You can use IApplicationBuilder.ApplicationServices
  // here if you need to resolve things from the container.
  public void Configure(
    IApplicationBuilder app,
    ILoggerFactory loggerFactory)
  {
    // If, for some reason, you need a reference to the built container, you
    // can use the convenience extension method GetAutofacRoot.
    this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();

    loggerFactory.AddConsole(this.Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
    app.UseMvc();
  }
}3

Startup

public class Startup
{
  public Startup(IHostingEnvironment env)
  {
    // In ASP.NET Core 3.0 env will be an IWebHostingEnvironment, not IHostingEnvironment.
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
    this.Configuration = builder.Build();
  }

  public IConfigurationRoot Configuration { get; private set; }

  public ILifetimeScope AutofacContainer { get; private set; }

  // ConfigureServices is where you register dependencies. This gets
  // called by the runtime before the ConfigureContainer method, below.
  public void ConfigureServices(IServiceCollection services)
  {
    // Add services to the collection. Don't build or return
    // any IServiceProvider or the ConfigureContainer method
    // won't get called.
    services.AddOptions();
  }

  // ConfigureContainer is where you can register things directly
  // with Autofac. This runs after ConfigureServices so the things
  // here will override registrations made in ConfigureServices.
  // Don't build the container; that gets done for you. If you
  // need a reference to the container, you need to use the
  // "Without ConfigureContainer" mechanism shown later.
  public void ConfigureContainer(ContainerBuilder builder)
  {
      builder.RegisterModule(new AutofacModule());
  }

  // Configure is where you add middleware. This is called after
  // ConfigureContainer. You can use IApplicationBuilder.ApplicationServices
  // here if you need to resolve things from the container.
  public void Configure(
    IApplicationBuilder app,
    ILoggerFactory loggerFactory)
  {
    // If, for some reason, you need a reference to the built container, you
    // can use the convenience extension method GetAutofacRoot.
    this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();

    loggerFactory.AddConsole(this.Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
    app.UseMvc();
  }
}4
Controller
public class Startup
{
  public Startup(IHostingEnvironment env)
  {
    // In ASP.NET Core 3.0 env will be an IWebHostingEnvironment, not IHostingEnvironment.
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
    this.Configuration = builder.Build();
  }

  public IConfigurationRoot Configuration { get; private set; }

  public ILifetimeScope AutofacContainer { get; private set; }

  // ConfigureServices is where you register dependencies. This gets
  // called by the runtime before the ConfigureContainer method, below.
  public void ConfigureServices(IServiceCollection services)
  {
    // Add services to the collection. Don't build or return
    // any IServiceProvider or the ConfigureContainer method
    // won't get called.
    services.AddOptions();
  }

  // ConfigureContainer is where you can register things directly
  // with Autofac. This runs after ConfigureServices so the things
  // here will override registrations made in ConfigureServices.
  // Don't build the container; that gets done for you. If you
  // need a reference to the container, you need to use the
  // "Without ConfigureContainer" mechanism shown later.
  public void ConfigureContainer(ContainerBuilder builder)
  {
      builder.RegisterModule(new AutofacModule());
  }

  // Configure is where you add middleware. This is called after
  // ConfigureContainer. You can use IApplicationBuilder.ApplicationServices
  // here if you need to resolve things from the container.
  public void Configure(
    IApplicationBuilder app,
    ILoggerFactory loggerFactory)
  {
    // If, for some reason, you need a reference to the built container, you
    // can use the convenience extension method GetAutofacRoot.
    this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();

    loggerFactory.AddConsole(this.Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
    app.UseMvc();
  }
}5

下載完整源碼

。轉(zhuǎn)載請注明來源地址:黑帽SEO http://m.790079.com 專注于SEO培訓(xùn),快速排名
黑帽WiKi_黑帽百科(m.790079.com),8年黑帽SEO優(yōu)化技術(shù),黑帽seo快速排名,黑帽SEO技術(shù)培訓(xùn)學(xué)習(xí),黑帽SEO快速排名程序、泛目錄、寄生蟲技術(shù),贈送免費黑帽SEO視頻教程

(黑帽seo技術(shù),網(wǎng)站快速排名,蜘蛛池加速收錄,目錄程序定制)

掃一下添加微信:



協(xié)助本站SEO優(yōu)化一下,謝謝!
關(guān)鍵詞不能為空

免責(zé)聲明

資料匯總于網(wǎng)絡(luò),如有侵權(quán) 聯(lián)系站長刪除 http://m.790079.com

同類推薦
站點信息
標簽列表
網(wǎng)站分類
友情鏈接
久久久国产一区_国产综合久久久久_欧美亚洲丝袜_成人综合国产精品
国产日韩欧美自拍| 日韩中文字幕免费视频| 久久精品aaaaaa毛片| 一本久道久久综合狠狠爱亚洲精品| 欧美连裤袜在线视频| 粉嫩av四季av绯色av第一区| 国产精品久久久久久久久影视| 日韩欧美手机在线| 久青草视频在线播放| 中文字幕在线中文字幕日亚韩一区| 男女午夜激情视频| www.国产精品一二区| 日韩欧美在线一区二区| 久久久婷婷一区二区三区不卡| 亚洲最大的av网站| 国产精品一区二区三区免费观看| 国产精品久久九九| 国严精品久久久久久亚洲影视| 久久精品中文字幕免费mv| 欧美一区亚洲二区| 久久国产手机看片| 日本a视频在线观看| 久久这里只有精品23| 午夜在线视频免费观看| 91传媒视频免费| 日日摸天天爽天天爽视频| 777午夜精品福利在线观看| 亚洲一区二区三区sesese| 97久久天天综合色天天综合色hd| 亚洲精品女av网站| 国产精成人品localhost| 色一情一乱一伦一区二区三区| 久久伊人一区| 日韩欧美亚洲在线| 北条麻妃一区二区三区中文字幕| 欧美在线3区| 国产精品美女免费视频| 国产日韩欧美在线| 亚洲图色在线| 国产不卡一区二区在线播放| 欧洲精品在线播放| 国产精品福利片| 国产精品一区二区性色av| 亚洲一区三区视频在线观看| 久色视频在线播放| 欧美在线不卡区| 久久成人在线视频| 99国产在线视频| 日本一区二区三区免费看| 国产成人女人毛片视频在线| 虎白女粉嫩尤物福利视频| 久热精品视频在线观看| 99热在线国产| 欧洲成人在线视频| 精品国产乱码久久久久久郑州公司 | 欧美成人在线影院| 99视频免费观看| 日韩电影天堂视频一区二区| 国产精品日韩一区二区三区| 国产精品亚洲自拍| 午夜免费日韩视频| www.久久久久| julia一区二区中文久久94| 日韩欧美亚洲日产国| 欧美老少配视频| 国产chinese精品一区二区| 国产中文字幕亚洲| 日韩wuma| 欧美日韩999| www.日韩不卡电影av| 国产精品亚洲一区二区三区| 欧洲精品亚洲精品| 在线视频一二三区| 久久久国产一区二区| 99久热re在线精品视频| 青春草国产视频| 亚洲影视九九影院在线观看| 国产精品露脸自拍| 国产成年人在线观看| 国产美女在线精品免费观看| 欧美综合在线第二页| 亚洲bt天天射| 久久99亚洲热视| www.日韩系列| 久久亚洲精品无码va白人极品| 国产一区二区色| 欧美有码在线观看视频| 亚洲人体一区| 色综合久久久888| 国产精品嫩草视频| 久无码久无码av无码| 国产美女在线精品免费观看| 欧美国产一二三区| 日本在线观看一区| 亚洲免费精品视频| 欧美极品在线播放| 国产精品免费观看在线| 久久久久久久久91| 116极品美女午夜一级| 国产精品专区h在线观看| 精品日本一区二区| 青青草成人在线| 日本黄网站色大片免费观看| 亚洲乱码国产一区三区| 精品久久久三级| 久久精品国产清自在天天线| 国产va亚洲va在线va| 国产精彩精品视频| 97成人精品视频在线观看| 国产欧美日韩专区发布| 免费日韩中文字幕| 欧美成人蜜桃| 欧美第一黄网| 免费在线观看毛片网站| 青草热久免费精品视频| 日韩免费一级视频| 日本人妻伦在线中文字幕| 亚洲 国产 欧美一区| 亚洲欧美成人一区| 亚洲va码欧洲m码| 中文字幕一区二区三区最新| 久久99精品久久久久久青青91| 精品久久中出| 蜜月aⅴ免费一区二区三区| 精品不卡在线| 自拍日韩亚洲一区在线| 中文字幕一区二区三区有限公司 | 国产mv免费观看入口亚洲| 91精品久久久久久久久久久久久 | 欧美 日韩 国产 高清| 日韩精品电影网站| 青青青国产在线观看| 欧美最大成人综合网| 欧美日韩另类丝袜其他| 欧美日韩一区在线观看视频| 欧美精品自拍视频| 欧美亚洲另类在线一区二区三区| 欧美一区深夜视频| 黄色a级片免费| 国产欧美亚洲日本| 99久热re在线精品996热视频| 8090成年在线看片午夜| 国产不卡一区二区三区在线观看 | 国产免费一区二区三区视频| 国产女主播av| 97精品伊人久久久大香线蕉| 久久免费观看视频| 久久久久久久国产精品| 久久久精品中文字幕| 欧美精品日韩三级| 亚洲一区二区三区四区视频 | 日本亚洲欧美三级| 欧美日韩免费观看一区| 国产一区二区免费在线观看| 成人a在线观看| 久久99精品国产一区二区三区| 久久久久久久午夜| 久久亚洲精品视频| 一区二区精品国产| 日本视频一区在线观看| 精品人妻大屁股白浆无码| 国产精品一区专区欧美日韩| 久久综合久久网| 国产精品免费一区二区三区都可以| 久久99亚洲热视| 亚洲一区二区三区乱码| 污视频在线免费观看一区二区三区| 日韩免费中文字幕| 国产一区二区精品免费| 91精品国产91久久久久久不卡| 久久久久久亚洲精品中文字幕| 国产精品国模在线| 亚洲 日韩 国产第一区| 欧美国产激情视频| 99精品视频在线看| 久久久精品免费| 亚洲中文字幕久久精品无码喷水| 日韩欧美第二区在线观看| 国精产品一区一区三区视频| 91禁国产网站| 精品国产拍在线观看| 国产99久久精品一区二区 夜夜躁日日躁| 午夜久久久久久久久久久| 欧美日韩国产三区| 成人av一级片| 国产精品视频网| 亚洲va码欧洲m码| 精品视频一区二区在线| 国产极品粉嫩福利姬萌白酱| 欧美精品免费播放| 日本10禁啪啪无遮挡免费一区二区| 国产免费一区二区三区| 精品国产一区二区在线| 亚洲国产一区二区三区在线| 精品一区二区视频| 久久青草福利网站| 色综合视频一区中文字幕| 欧美精品免费观看二区| 91久久伊人青青碰碰婷婷| 国产精品高潮呻吟久久av黑人|