如何将基础架构与 .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 个项目。它们是:
- Service.Core
- Service.Infrastructure
- Service.Api
据我了解,我可以添加从基础架构到核心的引用。从 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 pattern。 Service.Core 中不需要 ILogger
界面。添加一个是代码味道,因为日志记录不是域模型问题。
作为软件开发人员,我们知道 "Dependency Inversion Principle" 和 "Separation of Concerns" 是我们应该遵循的 2 个主要规则。大多数像 "Clean Architecture" 这样的架构模式为我们提供了一些实现细节。但是示例项目缺少一些细节。而且我找不到一个全面的解决方案。
我的服务解决方案有 3 个项目。它们是:
- Service.Core
- Service.Infrastructure
- Service.Api
据我了解,我可以添加从基础架构到核心的引用。从 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 pattern。 Service.Core 中不需要 ILogger
界面。添加一个是代码味道,因为日志记录不是域模型问题。