asp.netコアシリーズスタートアップ

この記事では、単純に記録し、いくつかは、起動クラスを使用して、ASP.NETのコアを。

 I.はじめに

スタートアップクラス、2つの一般的な方法があります。

  • ConfigureServices方法:サービスを設定するためのアプリケーション。 
  • 設定:要求処理パイプラインアプリケーションを作成します。

アプリケーションが起動するとき、彼らは、ある ASP.NETコアランタイム呼び出し:

パブリック クラススタートアップ
{ 
    // コンテナにサービスを追加するには、このメソッドを使用します。
    公共 のボイドConfigureServices(IServiceCollectionサービス
    { 
        ... 
    } 

    // HTTPリクエストパイプラインを設定するには、このメソッドを使用します。
    公共 ボイド設定(IApplicationBuilderアプリ
    { 
        ... 
    } 
}

 

適用された場合、ホストが構築されるときに(確立)、起動クラスは、アプリケーションに割り当てられています。

では、プログラム、ホストビルダーでビルドが呼び出されたときに、ホストアプリケーションが構築されています。

スタートアップクラスを呼び出すWebHostBuilderExtensions.UseStartup <TSTARTUP>法で規定されています。

パブリック クラスプログラム
{ 
    公共 静的 ボイドメイン(文字列[]引数)
    { 
        CreateWebHostBuilder(引数)。 ビルド) .RUN(); // 方法ビルド呼び出されたときにアプリケーションが起動時に割り当てられている間、ホストアプリケーションは、確立されています
    } 

    パブリック 静的 IWebHostBuilder CreateWebHostBuilder(文字列 []引数)=> 
        WebHost.CreateDefaultBuilder(引数)
            .UseStartup <起動時> (); 
}

 

起動クラスでは、依存性注入一般的な使用法:

パブリック クラススタートアップ
{ 
    プライベート 読み取り専用IHostingEnvironmentの_env。
    プライベート 読み取り専用IConfigurationの_config;
    プライベート 読み取り専用ILoggerFactory _loggerFactory。

    公共起動(IHostingEnvironmentのENV、IConfiguration設定、
        ILoggerFactory loggerFactory
    { 
        _ENV = ENV。
        _config = コンフィグ。
        _loggerFactory = loggerFactory。
    } 

    公共 のボイドConfigureServices(IServiceCollectionサービス)
    { 
        VARロガー= _loggerFactory.CreateLogger <起動時> (); 

        もし(_env.IsDevelopment())
        { 
            // 開発サービス構成

            logger.LogInformation(" 開発環境" )。
        } 
        
        { 
            // 非開発、サービス構成
            logger.LogInformation($ " 環境:{_env.EnvironmentName} " ); 
        } 

        // 設定の起動時に使用可能です。
        // 例:
         //    _config [ "キー"]
         //   _config [ "サブセクション:suboption1"] 
    } 
}

注射 IHostingEnvironment、実行時に、異なる環境で定義された起動(例えば、StartupDevelopmentなど)、適切な起動を選択したとき。 

二.ConfigureServices方法

これは3つの特徴があります。

  • オプショナル 
  • コールにする設定方法のConfigureServices前に呼び出します
  • 設定オプションを設定することに合意したと

1.通常呼追加{サービス}と{services.Configureサービス}。たとえば、次のように設定アイデンティティサービス

 

スタートアップメソッドが呼び出される前に2.ホストは、いくつかのサービスを構成することができます。たとえば、次の  ホストで

 

起動がホストを構成する、CreateDefaultBuilder法と呼ばれる前に。

3. {サービス} IServiceCollection拡張メソッドで追加次のいくつかの使用です。

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>()
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddEntityFrameworkStores<ApplicationDbContext>();


    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    // Add application services. 添加应用的服务
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
}

添加 services 到 service container 使它们在应用和Configure方法中可用。services方法可以通过 dependency injection 或 ApplicationServices 解析。

三.The Configure method

Configure方法用来指定应用怎样 处理HTTP request。请求管道(request pipeline)通过添加中间组件到IApplicationBuilder实例中来配置。

ASP.NET Core 模板 配置的管道:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc();
}

使用Use扩展方法添加一个或多个中间组件到请求管道。例如,UseMvc扩展方法添加 Routing Middleware 到请求管道 并且配置MVC 作为一个默认的处理器。

四.Convenience methods

不使用Startup类配置services和request processing pipeline。在host builder 上调用ConfigureServices和Configure的简便方法。如果存在多个ConfigureServices的调用,会依次添加。如果存在多个Configure方法的调用,最后一个Configure的调用会被使用。

public class Program
{
    public static IHostingEnvironment HostingEnvironment { get; set; }
    public static IConfiguration Configuration { get; set; }

    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
            })
            .ConfigureServices(services =>
            {
                ...
            })
            .Configure(app =>
            {
                var loggerFactory = app.ApplicationServices
                    .GetRequiredService<ILoggerFactory>();
                var logger = loggerFactory.CreateLogger<Program>();
                var env = app.ApplicationServices.GetRequiredServices<IHostingEnvironment>();
                var config = app.ApplicationServices.GetRequiredServices<IConfiguration>();

                logger.LogInformation("Logged in Configure");

                if (env.IsDevelopment())
                {
                    ...
                }
                else
                {
                    ...
                }

                var configValue = config["subsection:suboption1"];

                ...
            });
}

五.Extend Startup with startup filters (使用startup filter扩展 Startup)

使用 IStartupFilter ,在应用的Configure 中间件管道的开头或末尾配置中间件

IStartupFilter 实现Configure方法,它会接收和返回一个Action<IApplicationBuilder>。而IApplicationBuilder定义了一个类来配置一个应用的请求管道。

这些filters会按照添加到services container的顺序被调用。

下面是一个例子:

RequestSetOptionsMiddleware

public class RequestSetOptionsMiddleware
{
    private readonly RequestDelegate _next;
    private IOptions<AppOptions> _injectedOptions;

    public RequestSetOptionsMiddleware(
        RequestDelegate next, IOptions<AppOptions> injectedOptions)
    {
        _next = next;
        _injectedOptions = injectedOptions;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        Console.WriteLine("RequestSetOptionsMiddleware.Invoke");

        var option = httpContext.Request.Query["option"]; //取请求中的option参数

        if (!string.IsNullOrWhiteSpace(option))
        {
            _injectedOptions.Value.Option = WebUtility.HtmlEncode(option);
        }

        await _next(httpContext);
    }
}

RequestSetOptionsMiddleware 中间件被配置在 RequestSetOptionsStartupFilter 类中:

public class RequestSetOptionsStartupFilter : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return builder =>
        {
            builder.UseMiddleware<RequestSetOptionsMiddleware>();
            next(builder);
        };
    }
}

IStartupFilter 在 ConfigureServices中被注册到 service container, 并且从Startup类的外部增强Startup:

WebHost.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.AddTransient<IStartupFilter, 
            RequestSetOptionsStartupFilter>();
    })
    .UseStartup<Startup>()
    .Build();

当option的查询字符串存在时,中间件会在MVC中间件之前处理这个值

中间件的执行顺序是按照IStartupFilter的注册顺序

六. 补充

这里晚上补充下 ApplicationServices 解析services的使用

参考网址:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-2.2

おすすめ

転載: www.cnblogs.com/Vincent-yuan/p/11105523.html