Я понимаю, что интерфейсы определяют контракты, а классы, реализующие интерфейс, подписывают контракт.В этом случае мы можем спроектировать классы, чтобы они зависели от контракта, а не от конкретной реализации.Это имеет такие преимущества, как уменьшение связи, включение полиморфизма и т. Д.
Теперь я столкнулся с одним использованием интерфейсов, которое я не получил.Это из документации ASP.NET Core, касающейся конфигурации.В частности, на странице , речь идет о настройке MongoDB с ASP.NET Core.
Они в основном определяют класс и интерфейс следующим образом:
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
) напрямую?