使用命令模式时的依赖注入

2024-01-15

我是第一次使用命令模式。我有点不确定应该如何处理依赖关系。

在下面的代码中,我们发送一个CreateProductCommand然后排队等待稍后执行。该命令封装了它执行所需的所有信息。

在这种情况下,我们可能需要访问某种类型的数据存储来创建产品。我的问题是,如何将此依赖项注入到命令中以便它可以执行?

public interface ICommand {
    void Execute();
}

public class CreateProductCommand : ICommand {
    private string productName;

    public CreateProductCommand(string productName) {
        this.ProductName = productName;
    }

    public void Execute() {
        // save product
    }
}

public class Dispatcher {
    public void Dispatch<TCommand>(TCommand command) where TCommand : ICommand {
        // save command to queue
    }
}

public class CommandInvoker {
    public void Run() {

        // get queue

        while (true) {
            var command = queue.Dequeue<ICommand>();
            command.Execute();
            Thread.Sleep(10000);
        }
    }
}

public class Client {
    public void CreateProduct(string productName) {
        var command = new CreateProductCommand(productName);
        var dispatcher = new Dispatcher();
        dispatcher.Dispatch(command);
    }
}

非常感谢
Ben


查看您的代码后,我建议不要使用命令模式,而是使用命令数据对象和命令处理程序:

public interface ICommand { }

public interface ICommandHandler<TCommand> where TCommand : ICommand {
    void Handle(TCommand command);
}

public class CreateProductCommand : ICommand { }

public class CreateProductCommandHandler : ICommandHandler<CreateProductCommand> {
    public void Handle(CreateProductCommand command) {

    }
}

此方案更适合 CreateProductCommand 可能需要跨越应用程序边界的情况。此外,您还可以通过 DI 容器解析 CreateProductCommand 的实例,并配置所有依赖项。调度程序或“消息总线”在收到命令时将调用处理程序。

看一看here http://msdn.microsoft.com/en-us/library/ee658117.aspx#MessageBusStyle一些背景信息。

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

使用命令模式时的依赖注入 的相关文章

  • 使用编译时编织进行依赖注入? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我只是想了解 PostSharp 老实说我认为它太棒了 但有一件事对我来说很难如何纯依赖注入 不是服务定位器 无法完成 https cod
  • 计算从给定日期开始的月份中的第几天?

    我正在努力寻找一种简单有效的解决方案来计算每月的工作日 例如 如果给定日期是第一个星期一Monday 5th March 2018然后我想获取接下来 6 个月每个月第一个星期一的日期 例如 Monday 2nd April 2018 and
  • 数组与列表的性能

    假设您需要一个需要频繁迭代的整数列表 数组 我的意思是非常频繁 原因可能有所不同 但可以说它位于大容量处理的最内层循环的核心 一般来说 人们会选择使用列表 List 因为它们的大小具有灵活性 最重要的是 msdn 文档声称列表在内部使用数组
  • C#:DataSet.readXML( "filepath" ) 如何处理包含对象内对象内对象的 XML 文件?

    我有一个 xml 文件 格式如下
  • 在我的网站上显示 Google Analytics(分析)仪表板

    我设置了一个 ASP NET 网站 并使用 Google Analytics 进行页面跟踪 我唯一不喜欢的是我必须离开我的网站 到 Google Analytics 网站 才能看到该报告 有什么方法可以使用他们拥有的所有 AJAX 在我自己
  • ELMAH 将其数据保存在哪里?

    我刚刚安装了 ELMAH MVC 更多信息here http nuget org packages Elmah MVC 并且想知道其数据保存在哪里 我读到您可以选择设置数据库进行存储 但似乎默认安装使用 内存中 它是如何工作的 如果我回收应
  • 无法在.net core中使用WCF WSHttpBinding

    我正在尝试将我的项目从 net 移动到 net core 我最初在 net 中使用 WCF WSHttpBinding 服务 但无法在 net core 中使用相同的服务 我尝试使用 BasicHttpBinding 在客户端与 WsHtt
  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • WebClient读取错误页面的内容

    我有一个加载页面内容的应用程序 我使用 WebClient 类 即使服务器返回 404 500 等错误 我也需要检索内容 我需要这样的东西 WebClient wc new WebClient string pageContent try
  • Typescript:如何在自定义过滤器中使用角度 $filter

    如何在自定义过滤器中使用 Angular filter 如何注入 filter依赖 module Filters export class CustomFilter public static Factory return function
  • 为什么WCF中不允许方法重载?

    假设这是一个ServiceContract ServiceContract public interface MyService OperationContract int Sum int x int y OperationContract
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • 创建带有部分的选项卡式侧边栏 WPF

    我正在尝试创建一个带有部分的选项卡式侧边栏 如 WPF 中的以下内容 我考虑过几种方法 但是有没有更简单 更优雅的方法呢 方法一 列表框 Using a ListBox并将 SelectedItem 绑定到右侧内容控件所绑定的值 为了区分标
  • 将文本从文本文件添加到 PDF 文件[重复]

    这个问题在这里已经有答案了 这是我的代码 using FileStream msReport new FileStream pdfPath FileMode Create step 1 using Document pdfDoc new D
  • 元素属性语法和属性属性语法之间有语义差异吗?

    我认为元素属性语法和属性属性语法在语义上没有太大区别 但是 我发现一定有什么不同 例如 下面的例子只是演示了一个简单的触发器
  • 将标签文本的一部分设置为粗体

    有什么办法可以使一部分label text要大胆吗 label text asd string 想要string部分要加粗 有可能吗 这怎么办 下面的类说明了如何通过覆盖来做到这一点OnPaint in the LabelWinForms
  • Ninject Providers -> 在提供程序中获取另一个依赖项

    我想知道这里的最佳实践是什么 我需要为我的多租户应用程序构建一个 DbContext 因此我创建了一个如下所示的依赖项提供程序 public class TenantContextFactoryProvider Provider
  • DataGridView 中的 C# FormatException

    我创建了一个带有一些列的 DataGridView 订单列仅允许用户输入 int 数字 当我输入 j 例如 时 它会抛出 FormatException 并且我尝试添加 try catch 来解决问题 但它看起来不起作用 private v
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt

随机推荐

  • iOS 检查 WiFi 辅助是否已启用

    我正在尝试检查 WiFi 辅助是否已启用 当我连接到接入点获取一些数据时遇到问题 当我的连接状况不佳时 我的蜂窝数据会被使用并干扰我的接入点 有什么方法可以检查该选项是否启用 好吧 我想我能帮上一点忙 你需要check SCNetworkR
  • 路由到 Laravel 5 子文件夹中的控制器

    这是我的routes php Route get Panel PanelController index 这是我的文件夹 Http Controllers Panel PanelController php 这是我的控制器 namespac
  • 如何使用 Google Assist API 实现 Google Assistant

    我一直在查看并阅读有关 Google Now on Tap 的内容 来自http developer android com training articles assistant html http developer android c
  • 如何从元数据查找 OData 版本

    我可以访问 OData 服务 现在我需要找到该服务的 OData 版本 metadata 中有版本属性 但我不知道该选哪一个 我需要从
  • 如何保留 HTML
     标记中包含的文本的空白缩进,不包括文档中 
     标记的当前缩进级别?                
                

    我正在尝试在网站上显示我的代码 但在正确保留空格缩进方面遇到问题 例如给出以下代码片段 Here is my code pre def some funtion return Hello World end pre 这在浏览器中显示为 He
  • 如何在pyspark中将数据分成组

    我需要在时间序列数据中找到组 数据样本 我需要输出列group基于value and day 我尝试过使用 lag lead 和 row number 但最终一无所获 似乎每次值发生变化时您都想增加该组 如果是这样 这就是一种缺口和岛屿问题
  • 如何修复类型“Future”不是“String”类型的子类型 Flutter

    颤振初学者在这里 我收到此错误 type Future
  • Python 中的函数重载:缺失 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions As 函数重载 http web a
  • 平移/旋转后重置 CSS 变换原点

    在 CSS 中翻译元素后 其变换原点仍保留在其原始位置 在这种特殊情况下 我希望变换原点为stay在所有变换期间相对于元素居中 我希望起源是这样的follow被变换的元素 我知道关于transform origin属性 但这似乎需要我每次手
  • 为什么我在设置 LibGDX 时没有通用补间引擎

    接下来是关于设置 LibGDX 项目的教程 教程说在第三方部分应该有一个通用 Tween 引擎 地雷不显示 有什么办法可以显示吗 我需要下载什么 提前致谢 Gdx setup new ui jar 不附带 TweenEngine 库 还有另
  • z-index 不适用于绝对位置

    如果你看看我的测试网站here http www hosting mate com marinebuoysaustralia 您将看到 向下滚动 按钮与我的所有内容重叠 无论我输入什么 z index 有办法解决这个问题吗 我意识到我的立场
  • 在 VBscript 中使用命令行参数

    如何在 VBscript 中传递和访问命令行参数 Set args Wscript Arguments For Each arg In args Wscript Echo arg Next 从命令提示符运行脚本 如下所示 CSCRIPT M
  • 如何将 Spring Boot 与 MySQL 数据库和 JPA 结合使用?

    我想使用 MySQL 和 JPA 设置 Spring Boot 为此我创建 Person package domain import javax persistence Entity Table name person public cla
  • 什么是生成单元测试框架?

    在 stackoverflow 上我遇到了 mbunit 在其页面上 它指出 mbunit 是一个生成单元测试框架 但我找不到任何描述生成单元测试框架是什么的地方 我希望得到 一个定义 有关生成单元测试框架是什么和不是什么的文章的链接 生成
  • 如何在 C 程序(在 Linux 上)中接收使用 sigqueue 发送的信号?

    如何在 C 程序 在 Linux 上 中接收使用 sigqueue 发送的信号 如果只是使用kill来发送信号 我只需添加一个带有类似这样的接收器 signal SIGUSR1 sigusr1 指向一个像这样的简单函数 void sigus
  • 更新到 Hibernate 5 后无法访问 TransactionManager 或 UserTransaction

    我刚刚从 Hibernate 4 2 19 更新到 Hibernate 5 1 2 当然 这并不是说事情没有按计划进行 在解决了几个问题 其中 JOIN FETCH 必须替换为 JOIN 之后 我现在遇到了下一个问题 org springf
  • 在 Linux 上用 C 语言使用 RAW Socket 发送组播

    我编写了一个在 Ubuntu LTE 上运行的程序 该程序应该使用原始套接字将多播消息发送到 239 255 25 25 端口 5004 为了接收多播 我使用 UDP 套接字 通过套接字发送的数据是使用wireshark从rtp流中捕获的
  • 方案尾递归

    我正在尝试创建一个方案尾递归函数 flatten tl rec 来展平嵌套列表列表 define flatten tl rec lambda xs letrec flatten tl rec acc lambda xs acc cond e
  • Codeigniter REST API 提供未知方法?

    我在用着https github com chriskacerguis codeigniter restserver https github com chriskacerguis codeigniter restserver与代码点火器
  • 使用命令模式时的依赖注入

    我是第一次使用命令模式 我有点不确定应该如何处理依赖关系 在下面的代码中 我们发送一个CreateProductCommand然后排队等待稍后执行 该命令封装了它执行所需的所有信息 在这种情况下 我们可能需要访问某种类型的数据存储来创建产品