我对接口的理解是,它们定义了协议,实现接口的类遵循这个协议。在这种情况下,我们可以设计依赖于协议而不是具体实现的类。这有许多优点,例如降低耦合度、实现多态等。
现在我发现了一个使用接口的用法,我不太明白。这是来自 ASP.NET Core 文档中关于配置的一部分。特别地,在 页面 中,谈论了如何使用 ASP.NET Core 配置 MongoDB。
他们基本上定义了一个类和一个接口,如下:
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)工作,它们根本不提供任何功能。因此,为什么要在中间引入一个接口呢?
我没有看到这里有任何用途需要使用其他实现。 我不明白为什么要尝试解耦,我根本没有看到任何多态性的用处,并且我真的没有理解重点所在。
那么,在处理ASP.NET Core中的设置时,为什么要使用接口而不是直接使用具体类(例如BookstoreDatabaseSettings
)?
GetSettings
,它连接到外部数据库,您可能希望在单元测试中模拟它。 - NotFound