依賴注入基礎知識

幾乎任何控制器都需要一些外部依賴項才能工作。這是一種配置依賴項物件(或其工廠)並將其傳遞給控制器​​的方法。這樣做有助於維持關注點分離 ,保持程式碼清晰可測。

比如說,我們有一個介面及其實現,需要在其建構函式中使用 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:ConnectionStringappsettings.json 檔案中設定的路徑:

{
  ...
  },
  "Data": {
    "ConnectionString": "some connection string"
  }
}

終身管理

為了管理注入物件的生命週期,與 AddTransient 一起存在另外兩個選項:AddSingletonAddScoped。最後一個意味著物件的生命週期限定為 HTTP 請求。