【发布时间】:2020-02-10 21:01:17
【问题描述】:
作为软件开发人员,我们知道“依赖倒置原则”和“关注点分离”是我们应该遵循的两条主要规则。大多数架构模式,如“清洁架构”,都为我们提供了一些实现细节。但是示例项目缺少一些细节。而且我找不到一个全面的解决方案。
我的服务解决方案有 3 个项目。它们是:
- Service.Core
- Service.Infrastructure
- Service.Api
据我了解,我可以将基础架构的引用添加到核心。从 Api 项目到 Core。因为,Infrastructure 项目有一些实现细节,而 api 项目不需要知道这些实现细节。
据此:
问题 1: 对于数据库作业,我可以在 Core 项目中放置一个 IRepository 接口,我可以在 Infrastructure 项目中实现它。但是如何在不添加对基础设施项目的引用的情况下在 Api 项目中注册实现类型?
问题 2: 日志记录是一种 IO 工作。在我看来,它应该在基础设施项目中。我想使用 Serilog。我可以在 Core 项目中抽象 ILogger,但这还不够。例如,我应该为“UseSerilogRequestLogging”中间件做什么?或者我应该怎么做才能将 Serilog 添加到 CreateHostBuilder 中的通用主机?
推荐方法:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseSerilog();
【问题讨论】:
-
这种避免引用的尝试只会导致更多的混乱。只需了解组合根需要了解所有部分,以便正确映射/注册抽象及其实现。
-
也就是说,请注意:“请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。避免一次提出多个不同的问题”
标签: asp.net-core design-patterns dependency-injection inversion-of-control clean-architecture