gpt4 book ai didi

c# - 为什么要为这个配置类创建一个接口(interface)呢?

转载 作者:太空狗 更新时间:2023-10-29 21:21:01 25 4
gpt4 key购买 nike

我对接口(interface)的理解是它们定义契约,实现接口(interface)的类签署契约。在那种情况下,我们可以将类设计为依赖于契约而不是具体的实现。这具有减少耦合、启用多态性等优点。

现在我遇到了一种我没有得到的接口(interface)用法。这来自 ASP.NET Core 文档,关于配置。特别是,in the page ,一个是谈论用 ASP.NET Core 设置 MongoDB。

他们基本上像这样定义一个类和一个接口(interface):

namespace BooksApi.Models
{
public class BookstoreDatabaseSettings : IBookstoreDatabaseSettings
{
public string BooksCollectionName { get; set; }
public string ConnectionString { get; set; }
public string DatabaseName { get; set; }
}

public interface IBookstoreDatabaseSettings
{
string BooksCollectionName { get; set; }
string ConnectionString { get; set; }
string DatabaseName { get; set; }
}
}

然后他们按如下方式使用它:

public void ConfigureServices(IServiceCollection services)
{
services.Configure<BookstoreDatabaseSettings>(
Configuration.GetSection(nameof(BookstoreDatabaseSettings)));

services.AddSingleton<IBookstoreDatabaseSettings>(sp =>
sp.GetRequiredService<IOptions<BookstoreDatabaseSettings>>().Value);

services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

我必须说我不会明白。 BookstoreDatabaseSettings 类型的对象旨在用作设置的 DTO。它们根本不提供任何功能。那么为什么要在中间引入一个接口(interface)呢?

我在这里看不到可以使用其他实现的一种用法。我在这里看不出为什么有人试图将其解耦,我根本看不到多态性的任何用途,而且我真的不明白这一点。

那么为什么在这种情况下,在处理 ASP.NET Core 中的设置时,使用接口(interface)而不是直接使用具体类(例如 BookstoreDatabaseSettings)?

最佳答案

在只有一个应用程序的情况下,您认为这没有意义是正确的。但是,在某些情况下可能会发生这种情况。

这里发生的事情是,首先,BookstoreDatabaseSettings绑定(bind)到配置部分。从技术上讲,这就是所需要的。但是,这使用选项模式,这意味着您必须随后注入(inject) IOptions<BookstoreDatabaseSettings> , IOptionsSnapshot<BookstoreDatabaseSettings>等等,而不是 BookstoreDatabaseSettings直接地。这意味着对 Microsoft.Extensions.Options 的依赖,这不一定是坏事,但它仍然是一种依赖。

然后下一行将接口(interface)绑定(bind)到实际的 BookstoreDatabaseSettings实例,来自 IOptions<BookstoreDatabaseSettings> .换句话说,您现在可以简单地注入(inject)接口(interface),而不是 IOptions<BookstoreDatabaseSettings。 .同样,没有什么特别之处,但它抽象了 Microsoft.Extensions.Options 的使用。 .对于它的值(value),您可以轻松注册 BookstoreDatabaseSettings而不是界面来获得同样的东西。然后,你就可以注入(inject) BookstoreDatabaseSettings直接,不依赖 Microsoft.Extensions.Options .

接口(interface)在这里为您带来的是抽象实际的类实现。您可以将接口(interface)单独放在项目之间共享的库中,并将实际的类实现留给每个单独的项目。如果您的共享库仅依赖于接口(interface),那么提供的实际实现将无关紧要。但是,您也可以轻松地在项目之间共享类实现。这只是一个视角问题。

关于c# - 为什么要为这个配置类创建一个接口(interface)呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58064405/

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