[英]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();
//...
}
}
頁面模型初始化時,將注入適當的依賴項。
您正在使用“依賴注入”,但只有一半。 這是您所缺少的:
在容器中注冊服務(我將使用Class1
更好的名稱):
services.AddScoped<IConnectionOption, DatabaseConnectionOption>();
使頁面接收服務:
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.