Как разработчики программного обеспечения, мы знаем, что «Принцип инверсии зависимости» и «Разделение интересов» - это 2 основных правила, которым мы должны следовать. Большинство архитектурных шаблонов, таких как «Чистая архитектура», предлагают некоторые детали реализации для нас. Но примеры проектов содержат некоторые недостающие детали. И я не могу найти комплексное решение.
У моего сервисного решения есть 3 проекта. Это:
- Service.Core
- Service.Infrastructure
- Service.Api
Как я понимаю, я могу добавить ссылку от инфраструктуры до ядра. И от проекта Api до Core. Потому что в проекте Infrastructure есть некоторые детали реализации, и api-проекту не нужно знать эти детали реализации.
В соответствии с этим:
Вопрос 1: Для заданий базы данных я могу поместить интерфейс IRepository в Основной проект, и я могу реализовать это в инфраструктурном проекте. Но как я могу зарегистрировать типы реализации в проекте Api, не добавляя ссылку на проект инфраструктуры?
Вопрос 2: Ведение журнала является своего рода работой ввода-вывода. На мой взгляд, это должно быть в инфраструктурном проекте. Я хочу использовать Serilog. Я могу абстрагировать ILogger в основном проекте, но этого недостаточно. Например, что я должен сделать для промежуточного программного обеспечения "UseSerilogRequestLogging"? Или что я должен сделать, чтобы добавить Serilog к generi c хосту в CreateHostBuilder?
Рекомендуемый подход:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseSerilog();