如果我不能重用它,在干净架构的基础设施层中添加 EmailSender 的目的是什么?
What is the purpose of adding EmailSender in infrastructure layer in clean architecture if I cannot reuse it?
目前,我有一个应用程序是根据干净架构构建的。
Project.Core
Project.Infrastructure
Project.Api
在我的 Project.Core
中,我定义了接口 IEmailSender
并在 Project.Infrastructure
中的 EmailSender
中实现了它。我相信这是根据 clean architecture documentation of Microsoft 实施外部服务的正确方法。这非常适合我的应用程序。
我需要在用户注册应用程序时为他们实施电子邮件验证。所有与身份相关的(登录、注销、注册)都在同一解决方案中名为 Project.identityServer
的单独项目中处理。我很困惑,如果我在两个项目中都复制它,它可能会违反 DRY 设计原则。
我应该为公共模块创建另一个类库吗?如果是,在Infrastructure
中实现对外服务的目的是什么?
您使用接口可以在不修改代码的情况下更改实现。
如果将来您使用另一种“方式”发送邮件,您只需要更改 IMailSender
实现即可。否则,您将需要根据 MailSender
实施重构所有代码。
通常您也会在验证项目中使用 IMailSender
界面。所以是的,这个接口应该驻留在一个公共库中,这将被两个库引用。
然后您将在您的服务中注入(通常通过 IoC)实现,这取决于 IMailSender
通常您的基础结构库将具有您的接口的实现(其中一些可能在您的“核心”库中声明,其他的...)将被注入 类 使用它。
因此,“基础结构库”是一种抽象实现的方式,因此您的代码不依赖于特定的 类,而是依赖于接口,将来更容易 refactor/change。
还有其他一些要点(这也取决于您是否使用 DDD 等。这里每个域都有自己的基础设施)但对我来说这是基础设施层的主要“原因”。
在这种情况下,我不会复制界面,只要您在两个库中需要相同的功能即可。如果不是这种情况,则创建两个接口,每个接口满足特定需求。
目前,我有一个应用程序是根据干净架构构建的。
Project.Core
Project.Infrastructure
Project.Api
在我的 Project.Core
中,我定义了接口 IEmailSender
并在 Project.Infrastructure
中的 EmailSender
中实现了它。我相信这是根据 clean architecture documentation of Microsoft 实施外部服务的正确方法。这非常适合我的应用程序。
我需要在用户注册应用程序时为他们实施电子邮件验证。所有与身份相关的(登录、注销、注册)都在同一解决方案中名为 Project.identityServer
的单独项目中处理。我很困惑,如果我在两个项目中都复制它,它可能会违反 DRY 设计原则。
我应该为公共模块创建另一个类库吗?如果是,在Infrastructure
中实现对外服务的目的是什么?
您使用接口可以在不修改代码的情况下更改实现。
如果将来您使用另一种“方式”发送邮件,您只需要更改 IMailSender
实现即可。否则,您将需要根据 MailSender
实施重构所有代码。
通常您也会在验证项目中使用 IMailSender
界面。所以是的,这个接口应该驻留在一个公共库中,这将被两个库引用。
然后您将在您的服务中注入(通常通过 IoC)实现,这取决于 IMailSender
通常您的基础结构库将具有您的接口的实现(其中一些可能在您的“核心”库中声明,其他的...)将被注入 类 使用它。
因此,“基础结构库”是一种抽象实现的方式,因此您的代码不依赖于特定的 类,而是依赖于接口,将来更容易 refactor/change。
还有其他一些要点(这也取决于您是否使用 DDD 等。这里每个域都有自己的基础设施)但对我来说这是基础设施层的主要“原因”。
在这种情况下,我不会复制界面,只要您在两个库中需要相同的功能即可。如果不是这种情况,则创建两个接口,每个接口满足特定需求。