【问题标题】:Best way to dynamically load adapters in hexagonal architecture?在六边形架构中动态加载适配器的最佳方式?
【发布时间】:2018-10-30 09:21:58
【问题描述】:

我想将六边形架构应用于我的userManagement boundedContext。所以我想定义 2 个端口(一个用于UI,另一个用于serviceBus 集成,用于侦听来自其他服务的事件)。

问题是我是否想使用不同的技术为UI port 实现adapters(我不确定它应该被称为UI port,基本上这是CreateNewUser, BlockUser, CheckIfUserExists 操作所在的接口)使用不同的技术WCF 欧文。如何将它们添加到我的控制台应用程序?

假设我想使用 WCF 实现 Soap adapter 并使用 Owin 休息。在许多示例中,我看到人们为每个驱动适配器创建单独的控制台应用程序,即:MyDDD.UserManagement.Api.Rest.HostMyDDD.UserManagement.Api.Soap.Host。我想要实现的是一个主机应用程序以及以某种方式将适配器连接到它的能力。请分享您的想法!

【问题讨论】:

  • 你想同时使用它们还是互相替代?
  • 两个我都需要。
  • 我删除了答案,尝试提供一个更好的答案;)您对控制台应用程序是什么意思?据我了解,您希望拥有一个具有 UI 和服务总线的应用程序,并且它们都应该使用相同的应用程序服务,对吗?
  • consoleAppication 是指 .NET 中的项目类型。即 ClassLibrary 或 ConsoleApplicaion(可执行文件)。是的,我想要一项具有一个 UI 端口的服务(不是 UI 客户端应用程序)。现在,有一个团队开发了一个 Web 客户端应用程序,他们需要一个 rest api 来与我的服务进行通信。还有另一个团队创建了一个 WPF 应用程序,但他们想使用 WCF (Soap) 与我的服务进行通信。所以我想从我的服务中公开 2 个适配器。他们都将调用我的应用程序层。如果可能的话,我想要这个可配置的。动态添加或删除此适配器
  • 知道了。您是否有理由要动态添加/删除这些实现?架构约束?我看不出这样做有什么大的优势。更有可能增加更多不必要的复杂性。

标签: architecture domain-driven-design restful-architecture ddd-service hexagonal-architecture


【解决方案1】:

所以我想定义 2 个端口(一个用于 UI,另一个用于 serviceBus 集成,以侦听来自其他服务的事件)。

您误解了端口的概念。您所说的 UI 和服务总线集成是适配器。它们是端口的 2 个适配器。他们使用港口。他们调用港口提供的操作。该端口与技术无关,独立于交付机制。端口只是提供应用程序用例的接口。

UI 端口(我不确定它是否应该称为 UI 端口,基本上就是这样 CreateNewUser、BlockUser、CheckIfUserExists 的接口 实时操作)

端口应根据其用途命名。如果操作是为了管理用户,我应该称之为“userManagement”。或者,如果您的 BC 以这种方式命名,请将端口仅称为“api”(不过我更喜欢一个有意义的名称)。

如果我想实现适配器...如何将它们添加到我的控制台 应用?

我认为你在这里错了。如果控制台是指 CLI,那么控制台是端口的另一个适配器。您无需为其添加适配器。

如果我想使用不同的 UI 端口实现适配器 技术 WCF 和 Owin。如何将它们添加到我的控制台应用程序中?

我告诉你我的做法:适配器用一个名字(带有一个自定义注解)声明自己。主要组件在引导整个系统时会扫描适配器,并通过检查其名称为每个端口选择所需的适配器。

我想要实现的是一个主机应用程序和连接能力 以某种方式适应它。

我这样做:我有一个多模块项目。六边形是一个模块,每个适配器都是另一个模块。我有另一个名为“main”的模块,它可以一起构建并运行您想要的适配器。例如,您可以将每个端口所需的适配器放在属性文件中。我就是这样做的。

【讨论】:

  • “我认为你在这里错了。如果控制台是指 CLI,那么控制台是端口的另一个适配器。你不要向它添加适配器。” - 你在这里误会了我。我的意思是如何将适配器添加到我的主 exe 进程(控制台应用程序)。
  • "我这样做:我有一个多模块项目。六边形是一个模块,每个适配器都是另一个模块。我有另一个名为“main”的模块,它一起构建并运行“ - 这正是我一直在寻找的)您知道任何现有的开源项目,我可以在其中看到此类功能的示例吗?
  • google.com/…:请查看这张图片。有一个六边形架构的示例,其中定义了 5 个端口:其中之一是消息队列端口。但是你说,这应该是一个适配器,它会调用我的“userManagement”端口——对吧?
  • @DmitriBodiu 你好,很抱歉当你说“控制台”时误解了你。 “你知道任何现有的开源项目,我可以在哪里看到这种功能的例子?”我将在 github 上发布我的代码,但还没有完成。不知道那里有没有其他类似的项目(我猜有,但不知道)。
  • 我会上传一个例子到github。但是没有完成它。它是使用 Java 9 模块的六边形架构
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多