要在系統啟動時就執行某個 service 的方法 ## 法一:透過 `GetRequiredService<T>()` 在 startup.cs 的 Configure() 中,利用 GetRequiredService() 從 DI 取得需要的 service 可以 work,有個限制不能呼叫 Scoped dependencies 的物件 ```csharp public void Configure(IApplicationBuilder app) { var bitCodeCache = app.ApplicationServices.GetRequiredService<IOperatorBitCodeCache>(); bitCodeCache.Init(); } ``` ## 法二:直接注入要用的service (parameter inject at Configure()) 直接在 startup.cs 的 Configure() 注入要用的service 可以 work,但如果很多個 service 要注入,這個 method parameter 會超長 ```csharp public void Configure(IApplicationBuilder app, IOperatorBitCodeCache operatorBitCodeCache) { operatorBitCodeCache.Init(); } ``` ## 法三:在 ConfigureServices 中取得 service 會有問題噴errorlog,因為 Building IServiceProvider from the IServiceCollection, it can result in multiple constructions。在[這篇文章](https://github.com/serilog/serilog-aspnetcore/issues/251)內有說明 ``` Unhandled exception. System.InvalidOperationException: The logger is already frozen. at Serilog.Extensions.Hosting.ReloadableLogger.Freeze() at Serilog.SerilogHostBuilderExtensions.<>c__DisplayClass3_1.<UseSerilog>b__1(IServiceProvider services) ... ``` ``` public void ConfigureServices(IServiceCollection services) { services.AddScoped<Dependency>(); var provider = services.BuildServiceProvider(); var dependency = provider.GetRequiredService<Dependency>(); Console.WriteLine(dependency.Hello); } ``` ### 參考網址 [Resolve Services In ASP.NET Core Startup](https://khalidabuhakmeh.com/resolve-services-in-aspnet-core-startup)