この記事では、単純に記録し、いくつかは、起動クラスを使用して、ASP.NETのコアを。
I.はじめに
でスタートアップクラス、2つの一般的な方法があります。
- ConfigureServices方法:サービスを設定するためのアプリケーション。
- 設定:要求処理パイプラインアプリケーションを作成します。
アプリケーションが起動するとき、彼らは、ある ASP.NETコアランタイム呼び出し:
パブリック クラススタートアップ { // コンテナにサービスを追加するには、このメソッドを使用します。 公共 のボイドConfigureServices(IServiceCollectionサービス) { ... } // HTTPリクエストパイプラインを設定するには、このメソッドを使用します。 公共 ボイド設定(IApplicationBuilderアプリ) { ... } }
適用された場合、ホストが構築されるときに(確立)、起動クラスは、アプリケーションに割り当てられています。
では、プログラム、ホストビルダーでビルドが呼び出されたときに、ホストアプリケーションが構築されています。
スタートアップクラスを呼び出すWebHostBuilderExtensions.UseStartup <TSTARTUP>法で規定されています。
パブリック クラスプログラム { 公共 静的 ボイドメイン(文字列[]引数) { CreateWebHostBuilder(引数)。 (ビルド) .RUN(); // 方法ビルド呼び出されたときにアプリケーションが起動時に割り当てられている間、ホストアプリケーションは、確立されています } パブリック 静的 IWebHostBuilder CreateWebHostBuilder(文字列 []引数)=> WebHost.CreateDefaultBuilder(引数) .UseStartup <起動時> (); }
起動クラスでは、依存性注入一般的な使用法:
- IHostingEnvironment :コンフィギュレーションサービスenviironment(環境)。
- IConfiguration :読み込み設定
- ILoggerFactory :でStartup.ConfigureServicesにロガーを作成します。
パブリック クラススタートアップ { プライベート 読み取り専用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 模板 配置的管道:
- Developer Exception Page
- Exception handler
- HTTP Strict Transport Security (HSTS)
- HTTPS redirection
- Static files
- General Data Protection Regulation (GDPR)
- ASP.NET Core MVC and Razor Pages
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