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

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

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

黑帽白白白 SEO技術 712
:Decorator:從原理到實踐

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

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

實現批量注入,靜態獲取實例能。末尾處含有Autofac IocManager實現方式。

一、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實現

1、創建IocManager

IIocManager接口

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

IocManager實現

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

2、創建生命周期接口

    /// <summary>
    ///    標記依賴項生命周期的接口
    ///     <see cref="ILifetimeScopeDependency" />,
    ///     <see cref="ITransientDependency" />,
    ///     <see cref="ISingletonDependency" />
    /// </summary>
    public interface ILifetime { }
    /// <summary>
    /// 確定接口或類的生存期
    /// 單例模式,所有服務請求都將會返回同一個實例。
    /// </summary>
    public interface ISingletonDependency: ILifetime { }
    /// <summary>
    /// 確定接口或類的生存期
    /// 作用域模式,服務在每次請求時被創建,整個請求過程中都貫穿使用這個創建的服務。
    /// </summary>
    public interface ILifetimeScopeDependency : ILifetime { }
    /// <summary>
    /// 確定接口或類的生存期
    /// 瞬態模式,每次請求時都會創建。
    /// </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實現了單例模式,可以通過構造器注入獲取實例,也可以通過通過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實現

5.1、安裝 Autofac.Extensions.DependencyInjection包

5.2、 IocManager實現

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實現

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

靜態類 DependencyInjectionExtensions 添加UseIocManager方法。使用Autofac時可以在ConfigureContaine中直接注冊內容,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

下載完整源碼

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

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

掃一下添加微信:



協助本站SEO優化一下,謝謝!
關鍵詞不能為空

免責聲明

資料匯總于網絡,如有侵權 聯系站長刪除 http://www.790079.com

同類推薦
久久久国产一区_国产综合久久久久_欧美亚洲丝袜_成人综合国产精品
国产伦精品免费视频| 国产欧美日韩视频一区二区三区| 国产精品视频久久| 久久久国产影院| 久久精品电影网站| 日韩视频第一页| 日韩在线观看精品| 久久精品免费播放| 国产精品三级美女白浆呻吟| 久久99九九| 久久久国产精品免费| 国产精品丝袜久久久久久不卡| 日韩在线观看高清| 国产精品男人的天堂| 精品国产_亚洲人成在线| 一区二区不卡视频| 色婷婷精品国产一区二区三区| 日本精品一区二区三区视频 | 国产精品福利网| 久久夜精品va视频免费观看| 亚洲一二区在线| 日韩亚洲不卡在线| 免费观看美女裸体网站| 精品一区二区视频| 99视频在线播放| 日韩有码在线播放| 国产精品精品久久久| 国模精品视频一区二区三区| 粉嫩av一区二区三区免费观看| 91超碰中文字幕久久精品| www.日韩免费| 亚洲一区二区在线看| 秋霞在线观看一区二区三区| 国产在线拍偷自揄拍精品 | 久久视频国产精品免费视频在线| 日韩中文综合网| 欧美理论片在线观看| 视频一区二区三区免费观看| 国内精品国产三级国产99| 777精品视频| 国产精品久久久久9999| 日日摸日日碰夜夜爽av| 蜜桃传媒视频麻豆第一区免费观看| 99精品在线直播| 国产精品美女黄网| 欧美一区二区三区免费视| 国产主播精品在线| 久久久久久久香蕉| 一区二区视频在线播放| 男人添女人下部高潮视频在观看 | 亚洲在线免费看| 欧美高清视频一区| 国产精品ⅴa在线观看h| 精品久久久久久中文字幕动漫| 日韩精品久久一区二区| 99九九视频| 精品久久中出| 欧美日韩精品久久久免费观看| 97精品免费视频| 萌白酱国产一区二区| 黄色动漫在线免费看| 国产福利精品视频| 久久国产精品免费视频| 欧美中文在线观看| 国产a级一级片| 亚洲va欧美va在线观看| 国产美女久久精品| 国产精品欧美日韩一区二区| 日韩久久久久久久| 久久这里只有精品23| 亚洲一区二区免费| 97人人澡人人爽| 中文字幕欧美日韩一区二区| 国产亚洲综合视频| 久久综合亚洲社区| 黄色大片在线免费看| 国产精品情侣自拍| 欧美性在线视频| 日韩在线观看高清| 日韩免费在线播放| 久久久亚洲网站| 亚洲精品一区二| 91美女片黄在线观看游戏| 中文精品视频一区二区在线观看 | 黄色一级一级片| 久久精品99久久久久久久久| 日韩精品伦理第一区| 久久久www免费人成黑人精品 | 国产一级二级三级精品| 国产精品啪啪啪视频| 欧美精品成人一区二区在线观看| 久久久久久久久久伊人| 日韩欧美精品一区二区三区经典| 国产高清不卡无码视频| 日韩高清专区| 久久久91精品国产一区不卡| 人妻少妇精品久久| 国产精品视频专区| 国产欧美综合精品一区二区| 中文字幕在线中文| 91九色国产视频| 日本一区二区高清视频| 久久男人av资源网站| 日本国产高清不卡| 国产精品爽爽爽| 国产美女精品在线观看| 亚洲精品免费网站| 日韩在线视频免费观看高清中文| 狠狠色综合一区二区| 色综合天天狠天天透天天伊人| 99久久国产宗和精品1上映| 日本在线视频不卡| 国产精品日韩在线播放| 高清欧美性猛交| 日本一区二区三区免费观看| 国产精品日韩在线播放| 高清无码视频直接看| 亚洲一区精彩视频| 久久久久久久激情| 国产在线视频2019最新视频| 一本久久a久久精品vr综合| 国产成人精品免费看在线播放| 欧美 日韩 激情| 中文字幕日韩精品久久| 久久国产成人精品国产成人亚洲 | 欧美久久久久久久久久久久久 | 亚洲精品欧美一区二区三区| 久久久久久久久一区| 免费久久久久久| 午夜精品久久久久久久99热| 国产精品热视频| 91精品国产91久久久久久不卡 | 国产精品一区二区久久| 欧美一区二区三区……| 欧美xxxx18性欧美| 国产福利一区视频| 国产欧美日韩一区| 日本精品免费| 久久99青青精品免费观看| 国产成人精品久久亚洲高清不卡| 国内精品久久久久久中文字幕| 亚洲欧洲中文| 国产精品免费看久久久无码| 国产精品18久久久久久首页狼 | 国产一区二区三区av在线| 欧美一区二区大胆人体摄影专业网站 | 欧美高清视频一区二区三区在线观看| 宅男一区二区三区| 久久久久久久久91| 91久久偷偷做嫩草影院| 国产综合久久久久| 欧美在线一级va免费观看| 亚洲一区二区三区乱码aⅴ| 国产精品久久9| 日韩一区av在线| 久久全国免费视频| 日韩在线视频在线观看| 欧美亚洲国产精品| 久久露脸国产精品| 国产精品对白刺激| 欧美在线免费观看| 精品国产欧美成人夜夜嗨| 欧美在线3区| 亚洲最新在线| 九九精品在线视频| 国产精品国三级国产av| 日韩在线观看免费av| 国产av熟女一区二区三区| 91精品成人久久| 成人h在线播放| 国产欧美高清在线| 国产在线观看91精品一区| 欧美极品欧美精品欧美图片| 日韩久久久久久久久久久久| 三区精品视频观看| 丁香六月激情网| 午夜免费日韩视频| 亚洲精品在线免费看| 中文字幕欧美日韩一区二区| 久久99热精品| 国产a∨精品一区二区三区不卡| 国产精品第七十二页| 久久综合久久88| 萌白酱国产一区二区| 色在人av网站天堂精品| 又粗又黑又大的吊av| 亚洲影院色在线观看免费| 一区二区不卡在线| 亚洲国产日韩美| 日韩av不卡在线播放| 日韩av电影在线播放| 日韩精品一区二区三区外面| 日韩精品手机在线观看| 色99中文字幕| 日韩网站在线免费观看| 秋霞毛片久久久久久久久| 欧美性在线视频| 精品一区二区三区毛片| 国产日韩欧美另类| 国产精品一区二区久久久久|