---
# System prepended metadata

title: Resolve Services In ASP.NET Core Startup
tags: [C#]

---

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