.net - 如果我不能重用它,在干净架构的基础设施层中添加 EmailSender 的目的是什么?
问题描述
目前,我有一个根据干净架构构建的应用程序。
Project.Core
Project.Infrastructure
Project.Api
在我的内部,我Project.Core
已经定义了接口IEmailSender
并EmailSender
在Project.Infrastructure
. 我相信这是按照Microsoft 的干净架构文档实现外部服务的正确方法。这与我的应用程序完美配合。
我需要在用户注册应用程序时为他们实施电子邮件验证。Project.identityServer
所有与身份相关的(登录、注销、注册)都在同一个解决方案中调用的单独项目中处理。我很困惑,如果我在两个项目中复制它可能会违反 DRY 设计原则。
我应该为公共模块创建另一个类库吗?如果是,在 中实施外部服务的目的是什么Infrastructure
?
解决方案
您使用接口能够在不修改代码的情况下更改实现。
如果将来您使用另一种“方式”发送邮件,您只需要更改IMailSender
实现即可。否则,您将需要根据您的MailSender
实现重构所有代码。
通常你IMailSender
也会在你的验证项目中使用你的界面。所以是的,这个接口应该驻留在一个公共库中,两个库都将引用该库。
然后,您将在您的服务中注入(通常通过 IoC)实现,这取决于IMailSender
通常,您的基础设施库将具有接口的实现(其中一些可能在您的“核心”库中声明,其他......)将被注入使用它的类中。
因此,“基础设施库”是一种抽象实现的方法,因此您的代码不依赖于特定的类,而是依赖于接口,将来更容易重构/更改。
还有其他几点(这也取决于您是否使用 DDD 等。这里每个域都有自己的基础架构),但对我来说,这是基础架构层的主要“原因”。
在这种情况下,只要您在两个库中需要相同的功能,我就不会复制接口。如果不是这种情况,则创建两个接口,每个接口都服务于特定需求。
推荐阅读
- r - pandoc乳胶模板
- javascript - 如何使用本机 Windows 应用程序从客户端上的 PHP 应用程序编辑文档?
- swift - 具有预编译依赖项的 Swift 包
- python - 将导入的函数连接到没有依赖关系的 Qt5 进度条
- android - 如何在不打开键盘的情况下突出显示 textinputlayout
- shell - 根据分支类型列出分支名称
- ruby-on-rails - Rails redis-server 抛出 maxmemory 错误。Redis::CommandError(使用内存>'maxmemory'时不允许使用OOM命令。):
- slack - 如何在所有直接消息渠道中发布临时消息?
- python - 在 Tensorflow 对象检测中评估预训练模型时出错 (tensorflow.python.framework.errors_impl.NotFoundError:)
- html - 如何将一个垂直图像与块中的另外 2 个垂直图像对齐