【问题标题】:How To Completely Separate Infrastructure from .NetCore WebAPI or Should I?如何将基础架构与 .Net Core Web API 完全分离,还是应该?
【发布时间】: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


【解决方案1】:

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

日志实现也是如此,但请记住logging is a cross-cutting concernDecorator pattern 是最佳地址。 Service.Core 中不需要ILogger 接口。添加一个是一种代码味道,因为日志记录不是领域模型关注的问题。

【讨论】:

  • 你好@Mark,谢谢你的回答。这个答案不仅是我需要的,而且给了我一个很好的起点。我阅读了一些架构模式,但看起来我需要一些时间和更多的练习来内化这个主题。我读了你的博客。这个post 给了我一些观点。
猜你喜欢
  • 1970-01-01
  • 2019-01-13
  • 2012-04-18
  • 1970-01-01
  • 2019-02-03
  • 2015-10-21
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
相关资源
最近更新 更多