六边形架构:如何实现驱动端口
Hexagonal Architecture: How to implement driver ports
我正在研究将端口和适配器模式与分层架构一起使用。
所以我会有以下图层:
- framework/Infrastructure - 即 ASP.NET MVC、Entity Framework、SMTP 客户端
- 应用程序 - 将您的应用程序组合在一起并在您的域上执行操作的逻辑。
- domain - 定义域中的操作如何工作。定义域对象之间的关系
阅读 https://softwarecampament.wordpress.com/portsadapters/#tc2-3, https://fideloper.com/hexagonal-architecture 和其他几篇文章以及多个 youtube 演讲后,我仍在为如何实现驱动程序端口和适配器而苦恼。我理解驱动端口和适配器的概念,因为这是我在普通分层架构中所做的事情。
但我仍然不明白驱动程序端口和适配器将如何实现。
根据我的理解,驱动程序端口定义了它之外的层应该如何使用它所在的层。适配器是该端口在使用该端口的层上的实现。
但有些事情我正在纠结...应用层如何实现与领域层的接口?难道这不需要应用层知道领域层的交互作用吗?这完全破坏了使用界面的初衷。如果领域层提供了它外部应该使用的接口,并且该接口的适配器由使用该接口的层实现,则意味着该接口的用户也在实现该接口本身。这就像外层告诉内层如何工作......这违背了解耦的本质,甚至违背了一般的接口。
听起来像是业务层在告诉应用层,"Here's an interface that I'm providing you... IDK how it's gonna work so you tell me."但是为什么还要先有接口呢?
下面是一些代码来演示我所描绘的内容:
applicationLayer.UserRegisteringUseCasePort
public interface UserRegisteringUseCasePort
{
void Register(string username, string password, string passwordConfirm, string name);
}
frameworkLayer.UserRegisteringUseCaseAdapter
public class UserRegisteringUseCaseAdapter : UserRegisteringUseCasePort
{
private IUserRepository _userRepo;
public class UserRegisteringUseCaseAdapter(IUserRepository userRepo)
{
_userRepo = userRepo;
}
public void Register(string username, string password, string passwordConfirm, string name)
{
// validation logic
//... such as:
if (password != passwordConfirm) {
throw new Exception("password no match password confirm!");
}
userRepo.Add(new User(username, password, name));
}
}
对我来说,这似乎很糟糕,因为现在你已经强制框架层进行验证,这应该是域逻辑的一部分(自从我们在应用程序层停止以来,它甚至没有机会这样做).这也意味着应用层实际上并没有将业务逻辑整合在一起……它只是说明了它想要完成的操作,而让调用者决定如何去做。应该反过来吧?
总结
我知道我说了很多所以让我总结一下...驱动程序端口和适配器如何工作?在现实世界中,它们应该如何 used/implemented?
How do driver ports and adapters work? How should they be
used/implemented in real world scenarios?
Driver Ports是"application"的API(在HexArch术语中,应用程序是整个六边形,不要与应用程序层混淆)。他们向外界提供应用程序的功能(用例、用户故事或您称之为的任何东西)。
驱动程序适配器不实现驱动程序端口。这是很多人都会犯的错误。驱动程序适配器是应用程序外部使用驱动程序端口的软件组件。驱动程序端口是驱动程序适配器的依赖项。驱动程序适配器示例:MVC Web 控制器、REST 控制器、自动化测试框架等
驱动端口的实现是应用程序本身的业务逻辑。它是用例实现。在您的情况下,您将六边形分成两层:应用层和域。然后驱动程序端口的实现将是一个应用程序服务实现,它编排域对象以执行用例功能。
希望我的解释对您有所帮助。
我正在研究将端口和适配器模式与分层架构一起使用。
所以我会有以下图层:
- framework/Infrastructure - 即 ASP.NET MVC、Entity Framework、SMTP 客户端
- 应用程序 - 将您的应用程序组合在一起并在您的域上执行操作的逻辑。
- domain - 定义域中的操作如何工作。定义域对象之间的关系
阅读 https://softwarecampament.wordpress.com/portsadapters/#tc2-3, https://fideloper.com/hexagonal-architecture 和其他几篇文章以及多个 youtube 演讲后,我仍在为如何实现驱动程序端口和适配器而苦恼。我理解驱动端口和适配器的概念,因为这是我在普通分层架构中所做的事情。
但我仍然不明白驱动程序端口和适配器将如何实现。
根据我的理解,驱动程序端口定义了它之外的层应该如何使用它所在的层。适配器是该端口在使用该端口的层上的实现。
但有些事情我正在纠结...应用层如何实现与领域层的接口?难道这不需要应用层知道领域层的交互作用吗?这完全破坏了使用界面的初衷。如果领域层提供了它外部应该使用的接口,并且该接口的适配器由使用该接口的层实现,则意味着该接口的用户也在实现该接口本身。这就像外层告诉内层如何工作......这违背了解耦的本质,甚至违背了一般的接口。
听起来像是业务层在告诉应用层,"Here's an interface that I'm providing you... IDK how it's gonna work so you tell me."但是为什么还要先有接口呢?
下面是一些代码来演示我所描绘的内容:
applicationLayer.UserRegisteringUseCasePort
public interface UserRegisteringUseCasePort
{
void Register(string username, string password, string passwordConfirm, string name);
}
frameworkLayer.UserRegisteringUseCaseAdapter
public class UserRegisteringUseCaseAdapter : UserRegisteringUseCasePort
{
private IUserRepository _userRepo;
public class UserRegisteringUseCaseAdapter(IUserRepository userRepo)
{
_userRepo = userRepo;
}
public void Register(string username, string password, string passwordConfirm, string name)
{
// validation logic
//... such as:
if (password != passwordConfirm) {
throw new Exception("password no match password confirm!");
}
userRepo.Add(new User(username, password, name));
}
}
对我来说,这似乎很糟糕,因为现在你已经强制框架层进行验证,这应该是域逻辑的一部分(自从我们在应用程序层停止以来,它甚至没有机会这样做).这也意味着应用层实际上并没有将业务逻辑整合在一起……它只是说明了它想要完成的操作,而让调用者决定如何去做。应该反过来吧?
总结
我知道我说了很多所以让我总结一下...驱动程序端口和适配器如何工作?在现实世界中,它们应该如何 used/implemented?
How do driver ports and adapters work? How should they be used/implemented in real world scenarios?
Driver Ports是"application"的API(在HexArch术语中,应用程序是整个六边形,不要与应用程序层混淆)。他们向外界提供应用程序的功能(用例、用户故事或您称之为的任何东西)。
驱动程序适配器不实现驱动程序端口。这是很多人都会犯的错误。驱动程序适配器是应用程序外部使用驱动程序端口的软件组件。驱动程序端口是驱动程序适配器的依赖项。驱动程序适配器示例:MVC Web 控制器、REST 控制器、自动化测试框架等
驱动端口的实现是应用程序本身的业务逻辑。它是用例实现。在您的情况下,您将六边形分成两层:应用层和域。然后驱动程序端口的实现将是一个应用程序服务实现,它编排域对象以执行用例功能。
希望我的解释对您有所帮助。