端口和适配器体系结构旨在构建解耦的代码。域层不直接依赖于基础结构层,而是依赖于端口(接口),并且端口的实现在基础结构层中,对吧?
我的文件夹结构将如下:
我的UI项目
用于应用程序核心的项目,其中包含应用程序服务,域服务和域模型。
用于端口的项目:它严格包含接口。
一个用于基础设施的项目,并且我在其中有一个持久性文件夹。
可以切换传送机制(从控制台应用程序切换到Web应用程序...),Core仍然可以正常工作。
与基础架构相同,我可以使用实体框架一次,然后切换到dapper,而不会导致Core发生变化。
到目前为止还不错,还是我一路上错过了一些东西,还是错过了对体系结构的基本了解?
现在明智的代码:
如果我有一个控制台应用程序,则必须在其中键入命令并创建一个客户。
在Core项目中找到的Application Service中的类。它使用依赖注入来访问IPersistence的实现。
public class AddNewCustomer
{
private readonly IPersistence _persistence;
public AddNewCustomer(IPersistence persistence)
{
_persistence = persistence;
}
public bool addToDb(customer customer)
{
return _persistence.add(customer);
}
}
端口项目中的接口。
public interface IPersistence
{
bool add(Customer customer);
}
在接口项目中的实现。
public class Persistence: IPersistence
{
public bool add(customer customer)
{
//inserts into DB
}
}
端口项目是否应该严格关于接口? 您如何构造(文件夹结构)您的端口和适配器项目?
答案 0 :(得分:1)
到目前为止还不错,或者我一路上错过了什么,还是错过了 对体系结构的最基本的了解?
我会尽力表达自己的意思。希望对您有所帮助。
Ports and Adapters体系结构旨在构建解耦的代码。
是的。但这不是“本身”的主要目标。这是达到主要目标的一种方法,该方法是能够与超出应用程序范围的外部设备(硬件,软件,人等)隔离地进行测试。
Domain层不直接依赖于Infrastructure层, 相反,它取决于端口(接口)和实现 端口的端口在基础结构层,对吧?
您正在谈论图层。六角形建筑图案则没有。它只是说您拥有带有端口的应用程序(六边形),外部真实世界的设备(称为参与者)通过这些端口与应用程序进行交互。端口属于应用程序(与技术无关),并且端口与主体之间的交互是通过依赖于技术的适配器完成的。
用于应用程序核心的项目,其中包含应用程序 服务,域服务和域模型。
在这里,我想评论一下六角体系结构模式没有说明应用程序的内部结构(六边形)。
可以切换传送机制(从控制台应用程序切换到网络 应用...),Core仍然可以正常工作。
没关系。控制台和Web应用程序是驱动应用程序的适配器。它们使用驱动程序端口(向外部参与者提供应用程序功能的端口)。
我可能会使用实体框架一次,然后切换到dapper 而不会导致Core发生变化。
没关系。它们将是持久性端口的适配器,持久性端口是从动端口(从动适配器实现从动端口以与外部参与者交互)。
端口项目是否应该严格关于接口?怎么做 您构造(文件夹结构)您的端口和适配器项目?
我有一个用于六角形的“ java 9模块”(您称其为Core)。端口是我导出的模块包。每个端口都是一个程序包,服务接口定义了端口的操作。但是您可以拥有更多的类(表示操作参数,如果不想将内部对象暴露给外界,则表示映射器,...)。实施取决于您。
我的文件夹(java包)的结构是:
六角形:
[app-name] .hexagon.internal =应用程序内部
[app-name] .hexagon.driver。[driver-port-name] =一个或每个驱动程序端口(应用程序的API)
[app-name] .hexagon.driven。[driven-port-name] =一个或每个从动端口(应用程序的SPI)
使用技术在端口和角色之间的适配器:
[app-name] .adapter.driver。[driver-port-name]。[actor-name]。[technology] =每个驱动程序适配器一个
[应用名称] .adapter.driven。[驱动端口名称]。[角色名称]。[技术] =每个驱动适配器一个
我写了一篇有关六角形体系结构的文章,在其中解释了这种模式,并且我将发布一个实现示例。如果您想阅读,请点击以下链接:
https://softwarecampament.wordpress.com/portsadapters
希望有帮助。