在多租户 Web 应用程序中使用事件委托

2023-12-01

我正在使用 asp.net Mvc 5 开发一个多租户 n 层 Web 应用程序。

在我的服务层中,我为每个重要操作定义自定义事件,并在执行这些操作后引发这些事件。例如

Public event EventHandler EntityCreated;

Public void Create(Entity item) {
  Save(item);
  ......
  EntityCreated(this, item);
}

我打算将业务规则和通知与这些事件联系起来。我想使用事件的主要原因是逻辑的解耦以及更多事件处理程序的轻松可插入性,而无需修改我的服务层。

问题:在 ASP.NET 中使用事件和委托有意义吗?

我在网上找到的大多数示例都是针对 win 表单或 wpf。当涉及到多线程应用程序时,我获得了优势。还有每个表单定义一次事件并且在表单的整个生命周期内都处于活动状态。

但就我而言事件将根据 http 请求进行。那么定义这些事件是一种开销吗?


正如其他人指出的那样,发布/订阅或事件总线是一种解决方案。另一个解决方案类似于您在这里尝试做的事情,但使其更加正式。

我们来看一个创建客户的具体例子。您希望在应用程序中创建新客户时发送欢迎电子邮件。该域应该只关心创建客户并将其保存在数据库中,而不关心所有其他详细信息,例如发送电子邮件。因此,您添加了一个 CustomerCreated 事件。这些类型的事件称为领域事件,而不是用户界面事件(例如按钮单击等)。

当引发 CustomerCreated 事件时,应该在代码中的某个位置对其进行处理,以便它可以执行所需的操作。您可以像您提到的那样使用 EventHandlerService (但这很快就会涉及太多事件)或使用以下模式:乌迪·达汉谈论.我已经成功地将 Udi 的方法与许多 DI 容器一起使用,该模式的优点在于您的类保持 SRP 兼容。您只需使用反射在应用程序引导时实现特定的接口和注册代码。

如果您需要有关此主题的进一步帮助,请告诉我,我可以与您分享代码片段以使其正常工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在多租户 Web 应用程序中使用事件委托 的相关文章

随机推荐

  • 欧拉项目 #10 (Python)

    为什么我求 200 万以下所有素数总和的算法这么慢 我是一个相当初级的程序员 这就是我为寻找解决方案而想出的方法 import time sum 2 start time time for number in range 3 2000000
  • 为什么 secp256k1 未压缩公钥的格式不符合预期?

    一小段 Rust 代码 let secret key SecretKey from slice rand thread rng gen lt u8 32 gt expect 32 bytes within curve order let p
  • 带有回形针的水印

    根据这个例子 http dimaspriyanto com 2010 06 08 image watermarking with paperclip 我尝试在我上传的每张图片上添加水印 目前 我限制自己在大一 你猜怎么着 这不起作用 所以在
  • WPF 用户控件与父视图/视图模型的交互

    您好 我有一个 mainView 窗口 其 dataContext 设置为它自己的 viewModel 在该 viewModel 上有一个 DateTime 属性 该属性又使用 2 路绑定绑定到我的主视图上的日期选择器
  • 在 ViewPager 内水平滚动 webview

    我已将加载图像的 WebView 放入 ViewPager 中 当我尝试水平滚动图像时 我会移至下一个视图 而不是滚动图像 在移动到下一个视图之前是否可以使其滚动到图像的末尾 Override public Object instantia
  • 什么是 HTTP“主机”标头?

    由于发送 HTTP 请求时 TCP 连接已经建立 因此 IP 地址和端口是隐式已知的 TCP 连接是 IP 端口 那么 为什么我们需要Host标题 这是否仅在有多个主机映射到 TCP 连接中隐含的 IP 地址的情况下才需要 The Host
  • 使用附加字符串的整数对 WPF 数据网格进行排序

    我有一个 wpf 数据网格 我将 ObservableCollection 分配给它 DG1 DataContext a 其中一列的值如下所示 1 A B 12 A1 B 3 A2 B 10 A3 B 2 A4 B 15 A5 B 我想使用
  • 用 watir 检查标签类别?

    我有一个 div 它会根据表单是否正确提交而发生变化 我想知道是否可以检查类的特定元素 开始元素看起来像这样 div class input text div 如果输入不正确 请添加错误类别 div class input text err
  • iOS:在 ImageView 上绘制矩形并调整边框

    随附的1是一个名为 GeniusScan 的应用程序的屏幕截图 您可以在其中拍摄任何文档 并且图像视图上会显示可调整的矩形网格 您可以用手指轻松调整网格的边框 以选择要扫描的图像部分 然后它将转化为正确的预期 1 如何在图像视图上绘制网格并
  • ListView 中的空间超出了我的需要

    我使用 StackLayout 和 ListView 来显示视图的某些部分 但 ListView 占用的空间超出了我的需要 并且在列表的最后一行和配置文件延续之间留下了空白 看来我的 ListView 的行数比实际列表的长度多 或者它有固定
  • 如何在 swift 4 和 xcode 9 中的 UITableViewCell 中单击按钮时更新 UILabel? [复制]

    这个问题在这里已经有答案了 我正在构建一个订餐应用程序 其中有递增和递减按钮以及用于显示数量的 UILabel 我想更新单击增量和减量按钮时的数量标签 附有其图像 我的 ViewController 的一个片段是 protocol Gond
  • Java TimeZone.getTimeZone("PDT") 不工作

    它返回 GMT 的默认时区 使用 SimpleTimeFormat 并用 z 表示时区 它会打印 PDT 但 PDT 不在 TimeZone getAvailableIDs 返回的列表中 真是奇怪啊 有人知道为什么 PDT 不是标准 tz
  • 非聚集索引和聚集索引在同一列上

    我碰到this在 Stackoverflow 上发帖 第一个答案提到了类似的事情聚集索引包含表的所有数据 而非聚集索引仅包含列 聚集索引的位置或行 如果它位于堆上 没有聚集索引的表 非聚集索引怎么能有聚集索引的位置呢 它只包含在 B 树中排
  • 按列名称中的前缀排列列

    我有一个包含数百列的数据框 这是一个简化的示例 I need to arrange the order of specific columns so they are kept together based on the prefix in
  • 如何在 C# 中低延迟/极少延迟地播放音频文件?

    如何在 C 中以极小的延迟播放音频文件 mp3 我的意思是 文件应该在提供用户输入后立即开始播放 然后再播放 另外 如何同时并行播放两个音频文件 看看NAudio图书馆 要同时播放多个文件 请参阅这个帖子
  • 使用 JButton 将鼠标悬停在事件上

    我正在尝试在 JButton 上创建自定义鼠标悬停事件 原因是我的 JButton 当前是一个图像 所以我必须删除所有边框和动画等等 所以我这样做了 btnSinglePlayer setOpaque false btnSinglePlay
  • Spark 将隐藏参数添加到 Scala 类的构造函数中

    我不知道如何解释这一点 但 Spark 似乎向构造函数添加了一个隐藏 隐式 参数 这是我尝试过的代码spark shell 在常规 Scala shell 中参数列表将为空 scala gt class A defined class A
  • 使用 Rendertron 进行服务器端渲染 - 不带 firebase 的 Angular 5

    我使用 rendertron 作为服务器端渲染的解决方案 下面是 index js 文件 如何执行index js以及在哪里执行 我已经在我的服务器上使用 docker 设置了自己的 redertron 实例 并且我的角度应用程序构建位于
  • 将静脉坐标转换为 GPS

    我正在使用从以下位置导入的真实街道网络打开街道地图用于静脉模拟 例如卢森堡情景来自拉拉 科德卡 现在 为了准备可视化 使用 Google Earth 我想将模拟中的车辆位置从 SUMO 或 OmNET 坐标导出到 GPS 坐标 作为材料 我
  • 在多租户 Web 应用程序中使用事件委托

    我正在使用 asp net Mvc 5 开发一个多租户 n 层 Web 应用程序 在我的服务层中 我为每个重要操作定义自定义事件 并在执行这些操作后引发这些事件 例如 Public event EventHandler EntityCrea