[程式開發日記] ASP.NET Core的Singleton主動建立與被動建立 | 關於AddSingleton的執行順序

在ASP.NET Core中
常常使用Service做DI(依賴注入)動作
但是使用AddSingleton時
會遇到只有在呼叫時
才會建立物件的情況

所以針對標題的兩種情況
"被動建立"通常是使用如下方式

services.AddSingleton<MyClass>();

或是使用Func委派建立(通常都是有額外參數需要手動注入)

services.AddSingleton<MyClass>(new Func<IServiceProvider, MyClass>(() => {
    return new MyClass();
}));

針對"主動建立"可以使用以下方式

services.AddSingleton<MyClass>(new MyClass());
services.AddSingleton<MyClass>(new MyClass("Hello", "World"));

但是如果遇到建構子有多參數時
也不太可能像這樣一一注入
而且遇到注入順序也不好解

所以這時候就可以這樣寫

//在ConfigureServices方法...
services.AddSingleton<MyClass>();

//在Configure方法...
app.ApplicationServices.GetService<MyClass>();

上述兩行程式碼分別在不同的方法中呼叫
在第一行註冊之後
第二行會取得這個物件
(但是什麼事都不用做)
這樣的順序就能達成所謂的"主動建立"情況

這種方式適合某些情況使用
例如"主動定時執行"

留言