當我們在 .net core (2.1) 中執行如下程式碼注入 Lazy<T> 變數的時候:
public AccountService(Lazy<IHttpContextAccessor> httpContextAccessor) { }
可能會遇到這樣的錯誤提示:
InvalidOperationException: Unable to resolve service for type 'System.Lazy`1[Microsoft.AspNetCore.Http.IHttpContextAccessor]' while attempting to activate 'Senparc.Service.AccountService'.
原因在於系統沒有辦法識別 Lazy<T> 型別的依賴注入條件,我們可以在 Startup.cs 中的 public void ConfigureServices(IServiceCollection services) 方法中加入如下粗體程式碼使之生效:
public void ConfigureServices(IServiceCollection services) { services.AddMvc();//預設會有 services.AddTransient(typeof(Lazy<>));//註冊Lazy }
Lazy<T> 是一個非常好的延遲載入的特性,可以在使用到該變數的時候才真正進行引數例項化和一系列控制反轉的操作。因為通常我們某一個Service中可能只有一部分的方法需要用到某個變數,但是這個變數又需要在建構函式中依賴注入,此時 Lazy<T> 將幫助提升效率。