在应用层获取控制器 URL 的最佳方式

问题描述

我有一个具有多层的 .NET 5 应用程序:Web、应用程序、域和基础设施。到目前为止,我一直在尝试将每一层之间的关注点分开,并使依赖项向内指向 Web(基础设施 -> 应用程序 -> Web)。

我现在发现自己需要从应用程序层发送多封电子邮件,其中包含指向特定页面链接,我更喜欢使用来自 Web 层的 Url.Action(action,controller,params) 助手之类的东西而不是硬编码来动态构建这些电子邮件域或路径,但这意味着应用层将了解 Web/表示问题。

导致发送电子邮件的流程如下:

  • Web 层在控制器中接收请求,控制器发送 MediatR CQRS 命令
  • 应用层处理 CQRS 命令并发送 MediatR 通知
  • 应用层处理通知并发送电子邮件(我需要这里的网址)

我可以在命令中添加一个字段(例如 BaseURL),以便控制器可以在将命令发送到应用层之前设置它,但这似乎是错误的,因为它不是传入请求的一部分,我需要传播它通过几个与它无关的处理程序,只是因为最后它可能被最终处理程序使用。

有没有更好的方法解决这个问题?我是否应该在 Web 层中使用 MediatR 处理程序来处理这些情况?

解决方法

如果 web == http(s),这不是 web 的问题。它绝对不是应用程序逻辑的一部分。

电子邮件生成代码,如 http 响应生成代码是在用例中使用您的公共 API 的客户端代码。

您只需要一个新模块,也许该模块可以通过例如实现Apache Camel 或类似电子邮件发送的问题已经解决。

Web 和电子邮件模块可能共享一个企业(工作流)实体,该实体描述系统中的 url。我已经成功地使用 interface==folder 和 class==page 定义了该实体,并做了一个内部类的嵌套结构。放置在任何节点上的注释都可以控制例如安全。

可以在运行时解析结构以方便使用。我会去这样一个共享的实体,并且为模块进行更改的一个原因。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...