gpt4 book ai didi

c# - 依赖注入(inject)IOption类库

转载 作者:太空宇宙 更新时间:2023-11-03 18:21:10 25 4
gpt4 key购买 nike

我有一个类库,我想在其中从 appsettings.json 访问连接字符串。

应用设置.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 作为参数。但是如何调用类库来读取连接字符串呢? (当我让它工作时,我当然会读取数据并返回而不是连接字符串)。我看过几个例子,包括 net core 2.1 Dependency injection但是我不明白如何直接使用类库,是否有必要使用 Controller ?!

最佳答案

如果类库可以访问 DatabaseSettings,那么就没有必要将 Class1 库与 IOptions 紧密耦合,这更重要框架相关。

理想情况下,Class1 可以通过显式构造函数注入(inject)显式依赖于 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 被解析时,容器就会知道如何注入(inject) DatabaseSettings 依赖项。

另一种选择也可以是使用工厂委托(delegate)

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

这样,当 IndexModel 依赖于 IConnectionOption 进行注入(inject)时。

public class IndexModel : PageModel {
private readonly IConnectionOption connectionOption;

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

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

初始化页面模型时将注入(inject)适当的依赖项。

关于c# - 依赖注入(inject)IOption类库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53162735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com