首页 > 解决方案 > 如果我不能重用它,在干净架构的基础设施层中添加 EmailSender 的目的是什么?

问题描述

目前,我有一个根据干净架构构建的应用程序。

Project.Core
Project.Infrastructure
Project.Api

在我的内部,我Project.Core已经定义了接口IEmailSenderEmailSenderProject.Infrastructure. 我相信这是按照Microsoft 的干净架构文档实现外部服务的正确方法。这与我的应用程序完美配合。

我需要在用户注册应用程序时为他们实施电子邮件验证。Project.identityServer所有与身份相关的(登录、注销、注册)都在同一个解决方案中调用的单独项目中处理。我很困惑,如果我在两个项目中复制它可能会违反 DRY 设计原则。

我应该为公共模块创建另一个类库吗?如果是,在 中实施外部服务的目的是什么Infrastructure

标签: .net.net-corearchitecture.net-5clean-architecture

解决方案


您使用接口能够在不修改代码的情况下更改实现。

如果将来您使用另一种“方式”发送邮件,您只需要更改IMailSender实现即可。否则,您将需要根据您的MailSender实现重构所有代码。

通常你IMailSender也会在你的验证项目中使用你的界面。所以是的,这个接口应该驻留在一个公共库中,两个库都将引用该库。

然后,您将在您的服务中注入(通常通过 IoC)实现,这取决于IMailSender

通常,您的基础设施库将具有接口的实现(其中一些可能在您的“核心”库中声明,其他......)将被注入使用它的类中。

因此,“基础设施库”是一种抽象实现的方法,因此您的代码不依赖于特定的类,而是依赖于接口,将来更容易重构/更改。

还有其他几点(这也取决于您是否使用 DDD 等。这里每个域都有自己的基础架构),但对我来说,这是基础架构层的主要“原因”。

在这种情况下,只要您在两个库中需要相同的功能,我就不会复制接口。如果不是这种情况,则创建两个接口,每个接口都服务于特定需求。


推荐阅读