如何将基础架构与 .Net Core Web API 完全分离,或者我应该这样做吗?

How To Completely Separate Infrastructure from .NetCore WebAPI or Should I?

作为软件开发人员,我们知道 "Dependency Inversion Principle" 和 "Separation of Concerns" 是我们应该遵循的 2 个主要规则。大多数像 "Clean Architecture" 这样的架构模式为我们提供了一些实现细节。但是示例项目缺少一些细节。而且我找不到一个全面的解决方案。

我的服务解决方案有 3 个项目。它们是:

据我了解,我可以添加从基础架构到核心的引用。从 Api 项目到 Core。因为,基础设施项目有一些实施细节,api 项目不需要知道实施细节。

据此:

问题一: 对于数据库作业,我可以在 Core 项目中放置一个 IRepository 接口,然后在 Infrastructure 项目中实现它。但是如何在不添加对基础设施项目的引用的情况下在 Api 项目中注册实现类型?

问题二: 日志记录是一种 IO 作业。在我看来,它应该在基础设施项目中。我想使用 Serilog。我可以在 Core 项目中抽象 ILogger 但这还不够。例如,我应该为 "UseSerilogRequestLogging" 中间件做什么?或者我应该如何将 Serilog 添加到 CreateHostBuilder 中的通用主机?

推荐方法:

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
            .UseSerilog();

我假设 Service.Api 是您应用程序的入口点。那就是你放置 Composition Root. The entry point references all dependencies in order to compose them 的地方。所以,是的:Service.Api 应该引用 Service.Infrastructure.

日志记录实现也是如此,但请记住 logging is a cross-cutting concern best address with the Decorator patternService.Core 中不需要 ILogger 界面。添加一个是代码味道,因为日志记录不是域模型问题。