gpt4 book ai didi

c# - 我们什么时候需要IOptions?

转载 作者:行者123 更新时间:2023-11-30 22:55:56 28 4
gpt4 key购买 nike

我正在学习 .Net Core 中的 DI,但我不知道使用 IOptions 的好处。

如果我们可以不用它,为什么我们需要 IOptions

使用IOptions

interface IService
{
void Print(string str);
}

class Service : IService
{
readonly ServiceOption options;
public Service(IOptions<ServiceOption> options) => this.options = options.Value;
void Print(string str) => Console.WriteLine($"{str} with color : {options.Color}");
}

class ServiceOption
{
public bool Color { get; set; }
}

class Program
{
static void Main()
{
using (ServiceProvider sp = RegisterServices())
{
//
}
}


static ServiceProvider RegisterServices()
{
IServiceCollection isc = new ServiceCollection();

isc.Configure<ServiceOption>(_ => _.Color = true);
isc.AddTransient<IService, Service>();
return isc.BuildServiceProvider();
}
}

没有IOptions

interface IService
{
void Print(string str);
}

class Service : IService
{
readonly ServiceOption options;
public Service(ServiceOption options) => this.options = options;
public void Print(string str) => Console.WriteLine($"{str} with color : {options.Color}");
}

class ServiceOption
{
public bool Color { get; set; }
}

class Program
{
static void Main()
{
using (ServiceProvider sp = RegisterServices())
{
//
}
}

static ServiceProvider RegisterServices()
{
IServiceCollection isc = new ServiceCollection();

isc.AddSingleton(_ => new ServiceOption { Color = true });
isc.AddTransient<IService, Service>();
return isc.BuildServiceProvider();
}
}

最佳答案

在 .Net 核心中,建议您的所有配置都应根据其用例进行强类型化。这将帮助您实现关注点分离。

实际上,您可以在不使用您所说的 IOptions 的情况下实现相同的目的。所以,如果我后退一步,如果我们看一下 .net 核心配置中的所有可用选项:

<强>1。原始配置[路径: key ]

您可以直接访问 IConfiguration 实例并在访问器部分提供 JSON 键的路径,然后将返回配置值。

这不是好方法,因为在读取配置时这里没有强类型。

<强>2。绑定(bind)到配置部分的 IOptions

您可以使用 IOptions 实现(您已经知道)。这样更好,因为您可以拥有一个包含所有相关配置的类。 IOptions 接口(interface)为您提供了额外的好处。

据我了解,此 IOptions 接口(interface)将您的配置与读取配置的参与者分离,因此您可以使用 .net 核心框架中的一些附加服务。

请引用MSDN article for details关于好处。

您也可以引用twitter conversation at this blog.在那篇博客中,Rick 还解释说,他找不到任何实际案例来说明这种方法与下面的第三种方法有何不同 - 因为配置通常不是动态的,并且它们只在应用程序启动之前完成一次。

<强>3。 Configuration.Bind() 绑定(bind)到配置部分

您可以使用 .Bind 调用将配置部分绑定(bind)到 POCO 类。你得到强类型对象。在这里,如果多个参与者正在使用配置,他们将不会获得 IOptions 接口(interface)提供的额外服务。

我知道这并不能完全指出区别。但我相信这会让您更清楚地决定您的偏好。

关于c# - 我们什么时候需要IOptions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54844022/

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