簡體   English   中英

依賴注入IOption類庫

[英]Dependency injection IOption class library

我有一個要從appsettings.json訪問Connectionstring的類庫。

appsettings.json:

"DatabaseSettings": {
    "ConnectionString": "Server=.;Database=Test;Trusted_Connection=True;"
  },

在startup.cs中,我有以下代碼:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<DatabaseSettings>(Configuration.GetSection("DatabaseSettings"));
    services.AddOptions();

    services.AddTransient<IConnectionOption, Class1>();
}

並在類庫中

IConnectionOption.cs

public interface IConnectionOption
{
    void ReadValue();
}

Class1.cs

public class Class1 : IConnectionOption
{
    private readonly DatabaseSettings test;

    public Class1(IOptions<DatabaseSettings> dbOptions)
    {
        test = dbOptions.Value;    
    }    

    public void ReadValue()
    {
        var r = test;
    }
}

現在從index.cshtml調用類庫Class1

public class IndexModel : PageModel
{
    public void OnGet()
    {
        Class1 test = new Class1();
        test.ReadValue();
    }
}

但是,這當然不起作用,因為沒有構造函數采用零參數,我不認為應該將IOptions添加為參數。 但是,如何調用類庫以讀取連接字符串? (當我使它起作用時,我當然會讀取數據並返回,而不是返回連接字符串)。 我看了幾個例子,包括網絡核心2.1依賴注入,但是我不明白如何直接使用類庫,是否有必要使用控制器?

如果類庫可以訪問DatabaseSettings ,則確實不需要將Class1庫緊密耦合到IOptions ,而IOptions與框架更多相關。

理想情況下, Class1可以通過顯式構造函數注入顯式依賴DatabaseSettings

public class Class1 : IConnectionOption {
    private readonly DatabaseSettings test;

    public Class1(DatabaseSettings settings) {
        test = settings;    
    }    

    public void ReadValue() {
        var r = test;
        //...
    }
}

然后在Startup ,可以從配置中提取依賴項並在DI容器中注冊

public void ConfigureServices(IServiceCollection services) {
    var settings = Configuration.GetSection("DatabaseSettings").Get<DatabaseSettings>();
    services.AddSingleton<DatabaseSettings>(settings);    
    services.AddTransient<IConnectionOption, Class1>();
}

這樣,當解析Class1時,容器將知道如何注入DatabaseSettings依賴項。

另一個選擇也可以是使用工廠委托

public void ConfigureServices(IServiceCollection services) {
    var settings = Configuration.GetSection("DatabaseSettings").Get<DatabaseSettings>();
    services.AddTransient<IConnectionOption, Class1>(_ => new Class1(settings));
}

這樣,當IndexModel依賴於IConnectionOption進行注入時。

public class IndexModel : PageModel {
    private readonly IConnectionOption connectionOption;

    public IndexModel(IConnectionOption iConnectionOption) {
        connectionOption = iConnectionOption;
    }

    public void OnGet() {
        connectionOption.ReadValue();
        //...
    }
}

頁面模型初始化時,將注入適當的依賴項。

您正在使用“依賴注入”,但只有一半。 這是您所缺少的:

  1. 在容器中注冊服務(我將使用Class1更好的名稱):

     services.AddScoped<IConnectionOption, DatabaseConnectionOption>(); 
  2. 使頁面接收服務:

     public class IndexModel : PageModel { private readonly IConnectionOption _IConnectionOption; public IndexModel(IConnectionOption iConnectionOption) { _IConnectionOption = iConnectionOption; } public void OnGet() { _IConnectionOption.ReadValue(); } } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM