如果我不能重用它,在干净架构的基础设施层添加EmailSender的目的是什么?



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

Project.Core
Project.Infrastructure
Project.Api

在我的Project.Core中,我定义了接口IEmailSender,并在Project.Infrastructure中的EmailSender中实现了它。我相信这是按照微软清晰的体系结构文档实现外部服务的正确方法。

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

我应该为通用模块创建另一个classLibrary吗?如果是,在Infrastructure中实现外部服务的目的是什么?

使用接口可以在不修改代码的情况下更改实现。

如果将来你用另一种"方式"发送邮件,你只需要改变IMailSender的实现,这就是全部。否则,你需要根据MailSender的实现来重构所有的代码。

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

然后你将在你的服务中注入(通常通过IoC)实现,它依赖于IMailSender

通常你的基础设施库会有你的接口的实现(其中一些可能在你的"核心"中声明)。库和其他…),它将被注入使用它的类中。

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

还有一些其他的观点(这也取决于你是否使用DDD等,这里每个域都有自己的基础设施),但对我来说这是主要的"原因";

在这种情况下,我不会复制接口,只要您需要在两个库中使用相同的功能。如果不是这样,那么创建两个接口,每个接口满足特定的需求。

最新更新