目前,我有一个根据clean架构构建的应用程序。
Project.Core
Project.Infrastructure
Project.Api
在我的Project.Core
中,我定义了接口IEmailSender
,并在Project.Infrastructure
中的EmailSender
中实现了它。我相信这是按照微软清晰的体系结构文档实现外部服务的正确方法。
我需要在用户注册应用程序时为他们实现电子邮件验证。所有与身份相关的(登录、注销、注册)都在同一个解决方案中称为Project.identityServer
的单独项目中处理。我很困惑,如果我在两个项目中重复它,它可能会违反DRY设计原则。
我应该为通用模块创建另一个classLibrary吗?如果是,在Infrastructure
中实现外部服务的目的是什么?
使用接口可以在不修改代码的情况下更改实现。
如果将来你用另一种"方式"发送邮件,你只需要改变IMailSender
的实现,这就是全部。否则,你需要根据MailSender
的实现来重构所有的代码。
通常您也会在验证项目中使用IMailSender
接口。所以,是的,这个接口应该驻留在一个公共库中,它将被两个库引用。
IMailSender
通常你的基础设施库会有你的接口的实现(其中一些可能在你的"核心"中声明)。库和其他…),它将被注入使用它的类中。
基础设施库是一种抽象实现的方法,所以你的代码不依赖于特定的类,而是依赖于接口,在将来更容易重构/更改。
还有一些其他的观点(这也取决于你是否使用DDD等,这里每个域都有自己的基础设施),但对我来说这是主要的"原因";
在这种情况下,我不会复制接口,只要您需要在两个库中使用相同的功能。如果不是这样,那么创建两个接口,每个接口满足特定的需求。