gpt4 book ai didi

c# - IOptions 注入(inject)

转载 作者:IT王子 更新时间:2023-10-29 04:35:04 27 4
gpt4 key购买 nike

在我看来,让域服务需要 IOptions<T> 的实例是个坏主意。传递它的配置。现在我必须将额外的(不必要的?)依赖项添加到库中。我见过很多注入(inject) IOptions 的例子遍布网络,但我看不到它的额外好处。

为什么不直接将实际的 POCO 注入(inject)到服务中呢?

    services.AddTransient<IConnectionResolver>(x =>
{
var appSettings = x.GetService<IOptions<AppSettings>>();

return new ConnectionResolver(appSettings.Value);
});

或者甚至使用这种机制:

        AppSettings appSettings = new AppSettings();

Configuration.GetSection("AppSettings").Bind(appSettings);

services.AddTransient<IConnectionResolver>(x =>
{
return new ConnectionResolver(appSettings.SomeValue);
});

设置的使用:

public class MyConnectionResolver 
{
// Why this?
public MyConnectionResolver(IOptions<AppSettings> appSettings)
{
...
}

// Why not this?
public MyConnectionResolver(AppSettings appSettings)
{
...
}

// Or this
public MyConnectionResolver(IAppSettings appSettings)
{
...
}
}

为什么要有额外的依赖?什么是IOptions买我而不是老派的注入(inject)方式?

最佳答案

从技术上讲,没有什么能阻止您使用 ASP.NET Core 的依赖注入(inject)注册您的 POCO 类或创建包装类并返回 IOption<T>.Value从它。

但是您将失去 Options 包的高级功能,即在源更改时自动更新它们,如您在源中所见 here .

如您在该代码示例中所见,如果您通过 services.Configure<AppSettings>(Configuration.GetSection("AppSettings")); 注册您的选项它将读取 appsettings.json 中的设置并将其绑定(bind)到模型中,并另外跟踪它的更改。编辑 appsettings.json 时,将使用新值重新绑定(bind)模型,如 here 所示.

当然,如果您想将一些基础设施泄漏到您的域中,或者传递 Microsoft.Extensions.Options 提供的额外功能,您当然需要自己决定。包裹。这是一个非常小的包,未绑定(bind)到 ASP.NET Core,因此可以独立于它使用。

Microsoft.Extensions.Options包足够小,它只包含抽象和具体 services.Configure过载 IConfiguration (与配置的获取方式、命令行、json、环境、Azure key 保管库等更紧密相关)是一个单独的包。

总而言之,它对“基础设施”的依赖非常有限。

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

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