要在系統啟動時就執行某個 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)