依賴注入基礎知識
幾乎任何控制器都需要一些外部依賴項才能工作。這是一種配置依賴項物件(或其工廠)並將其傳遞給控制器的方法。這樣做有助於維持關注點分離 ,保持程式碼清晰可測。
比如說,我們有一個介面及其實現,需要在其建構函式中使用 config 中的一些值:
public interface ISomeDependency
{
async Task<IEnumerable<string>> GetItemsAsync(string key);
}
public class SomeDependency : ISomeDependency
{
public SomeDependency(string connectionString)
{
...
}
...
}
它用在某些控制器類中:
public class SomeController : Controller
{
private reanonly ISomeDependency dependency;
public SomeController(ISomeDependency dependency)
{
...
this.dependency = dependency;
}
...
public async Task<IEnumerable<string>> Get(string key) =>
await dependency.GetItemsAsync(key);
}
可以在 Startup.ConfigureServices
方法中呼叫 services.AddTransient
的控制器建構函式中注入此依賴項:
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder().
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
...
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
...
services.AddTransient(serviceProvider =>
new MyDependency(Configuration["Data:ConnectionString"]));
}
...
}
這裡 Data:ConnectionString
是 appsettings.json
檔案中設定的路徑:
{
...
},
"Data": {
"ConnectionString": "some connection string"
}
}
終身管理
為了管理注入物件的生命週期,與 AddTransient
一起存在另外兩個選項:AddSingleton
和 AddScoped
。最後一個意味著物件的生命週期限定為 HTTP 請求。