没有使用 SimpleInjector APIv3 注册类型 ICommandHandler

2023-11-29

我一直在使用 SimpleInjector,并尝试正确注册所有命令处理程序。

这是我的代码:

CQRS.cs

public interface ICommand {}

public interface ICommandDispatcher
{
    void Execute(ICommand command);
}

public class CommandDispatcher : ICommandDispatcher
{
    private readonly Container container;

    public CommandDispatcher(Container container)
    {
        this.container = container;
    }

    public void Execute(ICommand command)
    {
        var handlerType = typeof(ICommandHandler<>).MakeGenericType(command.GetType());

        dynamic handler = container.GetInstance(handlerType);

        handler.Handle((dynamic)command);
    }
}

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

处理程序.cs

public class UserCommandsHandler : ICommandHandler<CreateUser>
{
    public void Handle(CreateUser message)
    {
        var user = new User(message.Email);
        /* logic here */
    }
}

命令.cs

public class CreateUser : ICommand
{
    public readonly string Email;

    public CreateUser(string email)
    {
        Email = email;
    }       
}

全局.asax.cs

var assemblies = new[] { typeof(ICommandHandler<>).Assembly };
var container = new SimpleInjector.Container();
container.RegisterCollection(typeof(ICommandHandler<>), assemblies);
container.RegisterSingleton<ICommandDispatcher>(new CommandDispatcher(container));
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));

HomeController.cs

public class HomeController : Controller
{
    private readonly ICommandDispatcher _commandDispatcher;

    public HomeController(ICommandDispatcher commandDispatcher)
    {
        _commandDispatcher = commandDispatcher;
    }

    public ActionResult Index()
    {
        var command = new CreateUser("[email protected]");
        _commandDispatcher.Execute(command);
        return Content("It works");
    }
}

在 CQRS.cs

dynamic handler = container.GetInstance(handlerType);

I get:

没有注册类型ICommandHandler<CreateUser>可以找到。 不过,有一个注册IEnumerable<ICommandHandler<CreateUser>>; 您是想打电话吗GetAllInstances<ICommandHandler<CreateUser>>()或取决于IEnumerable<ICommandHandler<CreateUser>>?


简单的注射器 API 清晰可见区分馆藏登记和一对一的映射。在您的组合根中,您将进行以下注册:

container.RegisterCollection(typeof(ICommandHandler<>), 
    new[] { typeof(ICommandHandler<>).Assembly });

API 文档RegisterCollection states:

注册 serviceType 的集合,每次枚举已解析的 serviceType 集合时,都会延迟解析其实例。底层集合是一个流,它将根据每个实例的特定注册生活方式返回各个实例IEnumerator<T>.Current。类型在集合中出现的顺序与项目注册的顺序完全相同,即解析的集合是确定性的。

换句话说,您允许通过请求将命令处理程序解析为集合IEnumerable<ICommandHandler<T>>.

In your CommandDispatcher但是,您请求一个ICommandHandler<T>通过致电container.GetInstance(handlerType)。由于不存在一对一的映射ICommandHandler<T>,简单注入器通过抛出以下信息来通知您:

没有注册类型ICommandHandler<CreateUser>可以找到。 不过,有一个注册IEnumerable<ICommandHandler<CreateUser>>; 您是想打电话吗GetAllInstances<ICommandHandler<CreateUser>>()或取决于IEnumerable<ICommandHandler<CreateUser>>?

要解决此问题,有两种选择:

  1. 您可以使用一对一映射来注册处理程序,或者
  2. 您可以解析您的处理程序集合CommandDispatcher通过致电GetAllInstances(Type).

由于命令与其处理程序之间始终存在一对一的映射(这意味着:每个命令只有一个处理程序),因此选项 1 是最明显的解决方案。因此,将您的注册更改为以下内容:

// Use 'Register' instead of 'RegisterCollection'.
container.Register(typeof(ICommandHandler<>), 
    new[] { typeof(ICommandHandler<>).Assembly });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

没有使用 SimpleInjector APIv3 注册类型 ICommandHandler 的相关文章

  • 如何进入system.web.mvc

    有谁知道我如何进入system web mvc 我收到隐藏在 System Web Mvc DefaultModelBinder CreateModel 方法中的错误 无法创建抽象类 并且我无法判断代码的哪一部分导致了问题 有人建议我可以从
  • 为什么需要 JsonRequestBehavior?

    Why is Json Request Behavior needed 如果我想限制HttpGet对我的动作的请求我可以用 HttpPost 属性 Example HttpPost public JsonResult Foo return
  • 如何清除 ASP.NET MVC 应用程序中文本框的发布数据?

    默认情况下 使用 呈现的文本框使用发布数据中的值 例如如果页面上存在验证错误 将从发布的数据中检索该值并将其用于 value 属性 现在 在某些情况下 我希望能够清除该值 换句话说 我希望文本框为空 我不希望 MVC 从发布的数据中获取值并
  • 使用asp.net mvc计算相对日期

    在 C 中使用 ASP NET MVC 显示相对日期 例如 20 分钟前 的最佳库是什么 当简单的扩展方法可以做到这一点时 您就不需要库了 这是我使用过的扩展方法 public static string TimeAgo this Date
  • LINQ to Entities 不支持指定的类型成员“UserName”

    我尝试使用 url 中的 id 参数来显示特定用户的图像 但收到以下错误消息 LINQ to 不支持指定的类型成员 UserName 实体 仅初始值设定项 实体成员和实体导航 支持属性 这是我的操作方法 HttpGet public Act
  • 通过向导方法使用内置 ASP.NET MVC 验证

    我正在使用JQuery Steps 插件基本表单示例 http www jquery steps com Examples basic form为了我的巫师 在此示例中 您会注意到他们使用的是 JQuery Validate 插件 该插件与
  • GWT GIN 现场级注入

    我们正在评估 GWT 项目中使用 GIN 的情况 并通过构造函数参数进行典型注入 取得了良好的结果 我们遇到的困难是现场级注入 这些字段最终总是为空 有没有人有一个很好的例子来说明如何使用 GIN 正确实现字段级注入 Update 这是一些
  • 使用 DbContext 接口注册 AspNetCore 2.1 Identity 系统

    我正在开发 Asp Net Core 2 1 Web Api 我在用Microsoft Extensions DependencyInjection AspNetCore Identity and EntityFrameworkCore 在
  • Asp.NET MVC 应用程序中的静态类

    我想知道是否静态类 in an ASP NET MVC应用程序可能是多次初始化 我最初设计了我的应用程序 以便静态组件可以从数据库中获取一些内容并用作缓存 并且我向从构造函数调用的类添加了刷新方法 刷新方法也可通过应用程序的管理部分使用 在
  • Bool类型返回规则

    我使用 dapper ORM 所以我使用两个规则Query
  • MVC3 RESTful API 路由和 Http 动词处理

    我想为我的 MVC3 应用程序构建 RESTful Json Api 我需要帮助处理多个 Http Verbs 以操作单个对象实例 我读过 研究过 尝试过的内容 MVC 属性 HttpGet HttpPost等 允许我拥有一个具有多个共享相
  • asp.net mvc - 如何在 javascript 中循环访问模型数据

    我试图用 javascript 将数据添加到列表框 但是字符串构建语法让我难住了 var yourobject 导致错误 字符文字中的字符太多 全部代码 var mlb cm createListBox mylistbox title My
  • 如何使用 IHttpActionResult 设置标头

    我想将令牌添加到 webapi 请求的标头中 我怎样才能做到这一点 这是我的示例代码 public IHttpActionResult Authenticate Login data var Token fdsf123546fskjhf g
  • 在非 Angular 类中获取注入的依赖项

    我有当前的 和简化的 课程 export class NavigationItem constructor private router Router navigateTo this router navigate this id 我不想每
  • Dagger @Reusable 范围与 @Singleton

    来自用户手册 http google github io dagger users guide html 有时你想限制 Inject 构造的次数 类已实例化或调用了 Provides 方法 但您没有 需要保证在期间使用完全相同的实例 任何特
  • 在应用程序启动时将实例注册为“单例”bean

    我正在使用 Spring Boot 我正在尝试构建一个实例ServiceImpl时要解决Service是必须的 目前我将实现注释为 Component但这并没有给我机会构建我想要的实例 The ServiceImpl应使用包含磁盘上文件路径
  • 如何保护 ASP.NET Web API [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想建立一个RESTful使用 ASP NET Web API 的 Web 服务 第三方开发人员将使用该服务来访问我的应用程序的数据
  • 适用于移动应用程序的 REST API 上的 OAuth

    我正在开发移动应用程序的后端 使用 ASP NET MVC 4 Web Api 构建 RESTful API 该应用程序将在 iOS 和 Android 上运行 我的用户将只能使用他们的 Facebook 帐户登录 并且只有登录后 他们才能
  • MVC4:jQuery 验证不显眼的本机工作不正确

    我的 MVC4 Web 应用程序是在 Umbraco 7 上构建的 我已经安装了以下 nuget 软件包 jQuery 1 10 2 jQuery Validation 1 11 1 jQuery Validation Unobtrusiv
  • 如何添加没有值的属性

    我通过 html 助手和 TagBuilder 生成 HTML 文本框 我们有方法 TagBuilder Attributes Add key value 但对于 HTML5 required 属性不需要传递值 因此如果我传递空字符串 则输

随机推荐

  • 检测到带有 Chrome 驱动程序的 Python Selenium Web 驱动程序

    我假设 Selenium 打开的 chrome 浏览会话与 google chrome 本地安装相同 但是当我尝试在这个网站上搜索时 即使只是用 selenium 打开它并手动控制搜索过程 我也会收到一条错误消息 因为当我在自己的个人资料中
  • 如何说服 python 流对象从 isatty() 返回 true?

    Usually isatty 告诉您流是否是 TTY 并且是确定 stdout 或 stderr 是否是控制台的常用方法 问题是 当您在 IDE 下运行脚本时 输出会被重定向 因此 istty 将返回 False 或者甚至不会被定义 我想将
  • 如何获取 MongoDB 集合中的最低值?

    我有一个名为 Product 的 MongoDB 集合 其中包含以下文档 如下所示 product Milk barcode 12345 price 100 store BestBuy product Milk barcode 12345
  • 调用从电子表格返回自定义类型的 VBA 函数

    我有一个返回自定义数据类型的 vba 函数 定义为 Public Type stockValue stock As String value As Double End Type 我的问题是当我从电子表格单元格调用该函数时如何处理这个问题
  • 使用自写包部署Shiny应用

    我有一个工作闪亮的应用程序 它使用库 珊瑚 其中珊瑚是我自己编写的包 安装在闪亮应用程序的目录中 当我尝试将应用程序部署到shinyapps io 时 我收到以下消息 Error Unable to retrieve package rec
  • 自定义代码合约异常消息

    我有一个代码契约表示为这样 它验证要存储的实体不为空并且对于持久性有效 有用 棒极了 ContractClassFor typeof IRepository lt gt internal abstract class ContractsFo
  • DLL 加载库 - 错误代码 126

    我正在使用 Windows API 中的 LoadLibrary 当我运行该应用程序时 它会抛出错误代码 126 我读到这可能是由依赖项引起的 我检查了某些应用程序 如 Dependency Walker 出了什么问题 但一切都正常很好 在
  • 在所有活动中显示通用音乐播放器

    我正在为一支乐队开发一款应用程序 其中包含多种不同的活动 例如议程 新闻部分 专辑部分等 因为是乐队的作品 所以我想在背景中播放乐队的歌曲 这不是一个问题 但我想在所有活动的底部显示一个小型音乐播放器 以便用户可以随时停止 跳过或重播歌曲
  • 如何使用 StringBuilder 进行多个不区分大小写的替换

    我有一个 大 模板 想要替换多个值 替换需要不区分大小写 还必须能够拥有模板中不存在的键 例如 TestMethod public void ReplaceMultipleWithIgnoreCaseText const string te
  • 添加为 UIWindow 子视图的 UIView 不响应点击

    我添加了一个UIView含有一个UITapGestureRecognizer作为我的关键窗口的子视图 它显示正确 但是当我点击视图时 目标方法不会被触发 我什至尝试用手势识别器替换UIButton 仍然无济于事 这是我的代码 通知视图 h
  • 在基本工作区中查找具有部分字符串匹配的变量(Matlab)

    我想知道如何通过仅输入变量名称的一部分来在基本 MATLAB 工作区中查找变量 我有一长串变量并且我不知道确切的变量名称 是否有一个函数可以比较 匹配变量字符串列表中的字符顺序 Thanks 您可以使用who获取当前工作区中所有变量名称的列
  • 图像视图的放大和缩小问题,拖动最大和最小级别

    我已经实现了具有缩放和拖动功能的图像视图 我正在使用矩阵进行缩放和拖动功能 但我的问题是我无法设置最小和最大缩放级别以及拖动空间限制 任何人都可以告诉我我怎样才能做到这一点 private float spacing MotionEvent
  • 我可以使用 admob 而不在 Playstore 上传吗

    它似乎有效 但我不确定 Playstore 是否会要求我将来通过将应用程序上传到他们的 Playstore 来链接它 谁能确认我是否可以不链接它 谢谢 到 2023 年 如果您的应用未发布到 Google Play 商店或任何其他 Admo
  • 有没有用 C# 编写的 html 语法荧光笔的免费代码? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有没有用 C 编写的 html 语法荧光笔的免费代码 我正在寻找可以在 net mvc 应用程序中托管的内容 新答案 这些天我只是使用高亮js与 C
  • iOS 上图像中脸部的 2D 变形? (类似于胖布斯等)

    我只是想知道是否有人知道一些好的库或教程 了解如何实现从用户拍摄的图像中拍摄的脸部的 2D 变形 我想实现与 Fatify Oldify 所有那些 Fat Booths 等类似的效果 因为我正在创建一个应用程序 你可以在其中向脸部扔一些东西
  • SSH - 通过 CMD 拒绝权限(无法验证 [电子邮件受保护])

    我用的是Windows XP 当我尝试连接时 我遇到了奇怪的问题 电子邮件受保护 使用bashssh v 电子邮件受保护 我能够成功连接 但是当我尝试在同一台计算机上通过 cmd 连接时 我收到消息权限被拒绝 在调试时我发现在 bash 的
  • 如何自定义 sharepoint 2013 中的 Windows 身份验证弹出窗口?

    和之前一样 我在这里发布问题 如何在 SharePoint 2013 中使用 FBA 基于表单的身份验证 通过 Excel Service 将有效用户名传递给 SSAS 最后我决定使用基于声明的Windows身份验证 因为这种模式将Effe
  • 如何从 Webview 中访问相机?

    在我的 Android 应用程序中 我试图加载一个网页 必须访问相机 WebView 在我的笔记本电脑上 当我加载网页时 我可以访问相机 其他一切都在html显示页面 这是我放入的许可Manifest xml
  • 如何获取方法的调用者类

    我如何知道哪个类调用了某个方法 class A B b new B public void methodA Class callerClass b getCallerCalss it should be A class class B pu
  • 没有使用 SimpleInjector APIv3 注册类型 ICommandHandler

    我一直在使用 SimpleInjector 并尝试正确注册所有命令处理程序 这是我的代码 CQRS cs public interface ICommand public interface ICommandDispatcher void