.net 如果我不能重用EmailSender,那么在clean体系结构的基础结构层中添加EmailSender的目的是什么?

.net 如果我不能重用EmailSender,那么在clean体系结构的基础结构层中添加EmailSender的目的是什么?,.net,.net-core,architecture,.net-5,clean-architecture,.net,.net Core,Architecture,.net 5,Clean Architecture,目前,我有一个应用程序是根据clean架构构建的 Project.Core Project.Infrastructure Project.Api 在我的Project.Core中,我定义了接口iemailssender,并在Project.Infrastructure中的EmailSender中实现了它。我相信这是根据实施外部服务的正确方法。这非常适合我的应用程序 我需要在用户注册应用程序时为他们执行电子邮件验证。所有与身份相关的(登录、注销、注册)都在同一解决方案中名为project.ide

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

Project.Core
Project.Infrastructure
Project.Api
在我的
Project.Core
中,我定义了接口
iemailssender
,并在
Project.Infrastructure
中的
EmailSender
中实现了它。我相信这是根据实施外部服务的正确方法。这非常适合我的应用程序

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


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

您可以使用接口来更改实现,而无需修改代码

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

通常,您也会在验证项目中使用
IMailSender
界面。是的,这个接口应该位于一个公共库中,这两个库都会引用它

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

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

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

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


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

感谢您的输入@Rafa。但是仍然引用公共库将在低级别创建依赖性。因此,它毕竟不是一个干净的体系结构不……在您的情况下,您在核心项目中声明
IMailSender
(如果您的核心类需要发送邮件),然后在基础结构中声明实现。这将使用
IMailSender
注入核心类。这样,在核心项目中,您只需要使用所需的API就可以使用IMailSender。在基础设施中,您可以使用第三方软件包来实现邮件服务。因此,您的
Project.identityServer
应该参考Core&Infrastructure很棒!非常感谢。