C# 通过示例了解六边形端口和适配器的概念
在讨论六边形体系结构时,我试图理解端口和适配器的含义。今晚我读了很多解释,但是我没有找到一个代码示例。所以我要设计一个。我把端口理解为接口。例如:C# 通过示例了解六边形端口和适配器的概念,c#,domain-driven-design,C#,Domain Driven Design,在讨论六边形体系结构时,我试图理解端口和适配器的含义。今晚我读了很多解释,但是我没有找到一个代码示例。所以我要设计一个。我把端口理解为接口。例如: public interface IPerson { string GetName(); } 适配器是实现接口的类: public class Person : IPerson { //Implementation of GetName here } 我理解四人组适配器模式的概念。然而,我不明白这如何适用于DDD 在DDD的上下文中看到
public interface IPerson
{
string GetName();
}
适配器是实现接口的类:
public class Person : IPerson
{
//Implementation of GetName here
}
我理解四人组适配器模式的概念。然而,我不明白这如何适用于DDD
在DDD的上下文中看到一个简单的代码示例将非常有帮助
适配器是实现接口的类
不总是这样。对于驱动端来说是这样,但是对于驱动端来说,适配器是一个使用接口调用其方法的软件组件
我写了一篇关于端口和适配器模式体系结构的概念性文章:
在那里你可以读到它
今晚我读了很多解释,但是我没有找到答案
代码示例
我刚刚发明了一些代码,向您解释什么是端口,什么是适配器:
在网上商店中,驱动程序端口可以是:
public interface ForManagingShoppingCart {
public void addProductToShoppingCart ( String productId );
// ... more methods ...
}
public interface ForNotifyingClients {
public void sendPurchaseOrderConfirmation ( String recipient );
}
驱动程序适配器可以是控制器,它从UI接收用户请求并调用驱动程序端口的方法:
public class ShoppingCartController {
private final ForManagingShoppingCart forManagingShoppingCart;
// Injects port in the constructor
public ShoppingCartController ( ForManagingShoppingCart forManagingShoppingCart ) {
this.forManagingShoppingCart = forManagingShoppingCart;
}
// Method that executes when user selects a product in the view and clicks the "add product" button
public void addProductOnClick ( String productId ) {
this.forManagingShoppingCart.addProductToShoppingCart ( productId );
}
}
如果应用程序在您执行采购订单时向您发送电子邮件,则受驱动端口可以是:
public interface ForManagingShoppingCart {
public void addProductToShoppingCart ( String productId );
// ... more methods ...
}
public interface ForNotifyingClients {
public void sendPurchaseOrderConfirmation ( String recipient );
}
端口与技术无关,它不知道消息是否通过电子邮件发送。驱动适配器使用电子邮件系统实现端口
我理解四人组适配器模式的概念
适配器模式适合,因为您正在将端口接口方法转换为电子邮件系统接口方法
public class EmailNotificationAdapter implements ForNotifyingClients {
private final EmailSystem emailSystem;
// Inject the email system interface you want to use in the adapter constructor
public EmailNotificationAdapter ( EmailSystem emailSystem ) {
this.emailSystem = emailSystem;
}
// Implements the method using the email system to send an email
@Override
public void sendPurchaseOrderConfirmation ( String recipient ) {
// ...code that sends an email to the recipient using this.emailSystem
}
}
我不明白这怎么会适合DDD。。。这对我真的很有帮助
查看DDD上下文中的简单代码示例
DDD非常适合六边形结构:
应用层和域模型将位于hexagon内部。
应用程序服务API将是hexagon的驱动程序端口。
表示层UI将是一个驱动程序适配器。
基础结构层将包含受驱动适配器。
当应用层或域模型需要处理技术时,它们会定义一个驱动端口,基础结构中的驱动适配器将实现该端口。
适配器是实现接口的类
不总是这样。对于驱动端来说是这样,但是对于驱动端来说,适配器是一个使用接口调用其方法的软件组件
我写了一篇关于端口和适配器模式体系结构的概念性文章:
在那里你可以读到它
今晚我读了很多解释,但是我没有找到答案
代码示例
我刚刚发明了一些代码,向您解释什么是端口,什么是适配器:
在网上商店中,驱动程序端口可以是:
public interface ForManagingShoppingCart {
public void addProductToShoppingCart ( String productId );
// ... more methods ...
}
public interface ForNotifyingClients {
public void sendPurchaseOrderConfirmation ( String recipient );
}
驱动程序适配器可以是控制器,它从UI接收用户请求并调用驱动程序端口的方法:
public class ShoppingCartController {
private final ForManagingShoppingCart forManagingShoppingCart;
// Injects port in the constructor
public ShoppingCartController ( ForManagingShoppingCart forManagingShoppingCart ) {
this.forManagingShoppingCart = forManagingShoppingCart;
}
// Method that executes when user selects a product in the view and clicks the "add product" button
public void addProductOnClick ( String productId ) {
this.forManagingShoppingCart.addProductToShoppingCart ( productId );
}
}
如果应用程序在您执行采购订单时向您发送电子邮件,则受驱动端口可以是:
public interface ForManagingShoppingCart {
public void addProductToShoppingCart ( String productId );
// ... more methods ...
}
public interface ForNotifyingClients {
public void sendPurchaseOrderConfirmation ( String recipient );
}
端口与技术无关,它不知道消息是否通过电子邮件发送。驱动适配器使用电子邮件系统实现端口
我理解四人组适配器模式的概念
适配器模式适合,因为您正在将端口接口方法转换为电子邮件系统接口方法
public class EmailNotificationAdapter implements ForNotifyingClients {
private final EmailSystem emailSystem;
// Inject the email system interface you want to use in the adapter constructor
public EmailNotificationAdapter ( EmailSystem emailSystem ) {
this.emailSystem = emailSystem;
}
// Implements the method using the email system to send an email
@Override
public void sendPurchaseOrderConfirmation ( String recipient ) {
// ...code that sends an email to the recipient using this.emailSystem
}
}
我不明白这怎么会适合DDD。。。这对我真的很有帮助
查看DDD上下文中的简单代码示例
DDD非常适合六边形结构:
应用层和域模型将位于hexagon内部。
应用程序服务API将是hexagon的驱动程序端口。
表示层UI将是一个驱动程序适配器。
基础结构层将包含受驱动适配器。
当应用层或域模型需要处理技术时,它们会定义一个驱动端口,基础结构中的驱动适配器将实现该端口。
TLDR:端口和适配器不像usb插头和usb插座。适配器是USB到Lightning的电缆 在讨论六边形体系结构时,我试图理解端口和适配器的含义 这有点纠结,尤其是因为 光是照片并不能说明这个故事 这些图片看起来很像洋葱,并且以不同的方式讲述了这个故事。 两个嵌套多边形传统上,两个六边形表示逻辑边界。核心域逻辑完全位于内部多边形中。外部多边形的外部是真实世界:消息总线、数据库、UI、文件系统等等。所有这些东西都有端口 例如,在交互式shell中,您的端口是stdin、stdout、stderr 适配器是我们放置的东西,因为外部bou的端口 ndary和内部边界处的端口不匹配。我的域模型不会说SQL,所以我有一个适配器,它位于域模型和数据库客户机之间。我的域模型不理解终端格式,所以我有一个适配器位于域模型和交互式shell之间 这里的神奇之处在于,我们可以通过更改适配器将新组件组合在一起。我的域逻辑也不知道HTML表示,但我应该能够用web浏览器适配器替换交互式shell适配器,并为用户提供与域模型交互的新方式。我应该能够通过使用新的适配器与新的稳定存储设备通信来切换持久性策略 端口通常是接口,因为我们在边界上关心的是清楚地定义需要满足的契约,而不耦合到特定的实现 我不明白这与DDD有什么关系 一个原因是很难看出这是否合适;端口和适配器是管道,而不是域模型。所有证明域分析工作正确性的位都位于内部多边形中 存储库和域服务是适配器的常见形式。域服务通常是端口,由应用程序或基础结构组件提供实现。类似地,存储库通常是应用程序和存储的聚合集合之间的适配器形式 建议阅读:
*@c2 wikiTLDR:端口和适配器不像usb插头和usb插座。适配器是USB到Lightning的电缆 在讨论六边形体系结构时,我试图理解端口和适配器的含义 这有点纠结,尤其是因为 光是照片并不能说明这个故事 这些图片看起来很像洋葱,并且以不同的方式讲述了这个故事。 两个嵌套多边形传统上,两个六边形表示逻辑边界。核心域逻辑完全位于内部多边形中。外部多边形的外部是真实世界:消息总线、数据库、UI、文件系统等等。所有这些东西都有端口 例如,在交互式shell中,您的端口是stdin、stdout、stderr 适配器是我们放置的东西,因为外部边界的端口和内部边界的端口不匹配。我的域模型不会说SQL,所以我有一个适配器,它位于域模型和数据库客户机之间。我的域模型不理解终端格式,所以我有一个适配器位于域模型和交互式shell之间 这里的神奇之处在于,我们可以通过更改适配器将新组件组合在一起。我的域逻辑也不知道HTML表示,但我应该能够用web浏览器适配器替换交互式shell适配器,并为用户提供与域模型交互的新方式。我应该能够通过使用新的适配器与新的稳定存储设备通信来切换持久性策略 端口通常是接口,因为我们在边界上关心的是清楚地定义需要满足的契约,而不耦合到特定的实现 我不明白这与DDD有什么关系 一个原因是很难看出这是否合适;端口和适配器是管道,而不是域模型。所有证明域分析工作正确性的位都位于内部多边形中 存储库和域服务是适配器的常见形式。域服务通常是端口,由应用程序或基础结构组件提供实现。类似地,存储库通常是应用程序和存储的聚合集合之间的适配器形式 建议阅读:
*@c2 wiki那么域服务是端口和适配器?那么域服务是端口和适配器?