问题标签 [simple-injector]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - Simpleinjector:当我有 2 个实现并想选择一个时,这是 RegisterManyForOpenGeneric 的正确方法吗?
使用带有此处描述的命令模式和此处描述的查询模式的简单注入器。对于其中一个命令,我有 2 个处理程序实现。第一个是同步执行的“正常”实现:
另一个类似于命令装饰器,但显式包装了前一个类以在单独的线程中执行命令:
有一段时间 simpleinjector 对我大喊大叫,告诉我它找到了IHandleCommands<SendEmailMessageCommand>
. 我发现以下方法有效,但不确定它是否是最佳/最佳方式。我想显式注册这个接口以使用 Async 实现:
我的问题:这是正确的方法,还是有更好的方法?例如,我想将 Simpleinjector 抛出的现有异常重用于所有其他实现,而不必在回调中显式抛出它们。
更新对史蒂文的回答的回复
我已经更新了我的问题,使其更加明确。我以这种方式实现它的原因是因为作为操作的一部分,该命令会在成功发送后更新在 db 实体上System.Nullable<DateTime>
调用的属性。SentOnUtc
MailMessage
和都由实体框架类实现。根据 http 上下文注册,使用ICommandEntities
此处描述的方法:IUnitOfWork
DbContext
DbContext
RegisterPerWebRequest
simpleinjector wiki 中扩展方法的默认行为是在HttpContext
为 null 时注册一个临时实例(它将在新启动的线程中)。
这就是为什么 Launch 方法使用服务定位器模式来获取 的单个实例DbContext
,然后将其直接传递给同步命令处理程序构造函数。为了使_entities.Update(emailMessageEntity)
和_unitOfWork.SaveChanges()
行工作,两者必须使用相同的 DbContext 实例。
注意:理想情况下,发送电子邮件应由单独的投票工作人员处理。这个命令基本上是一个队列清算所。数据库中的 EmailMessage 实体已经拥有发送电子邮件所需的所有信息。这个命令只是从数据库中抓取一个未发送的,发送它,然后记录动作的日期时间。这样的命令可以通过从不同的进程/应用程序轮询来执行,但我不会接受这个问题的这样的答案。现在,当某种 http 请求事件触发它时,我们需要启动这个命令。
c# - 当某些类型没有实现时,这是 RegisterDecorator 的正确方法吗?
使用带有此处描述的命令模式的简单注入器。大多数命令都有实现流利验证的伴随类AbstractValidator<TCommand>
,这意味着它们也实现了 FV IValidator<TCommand>
。然而,对每个命令都有一个验证器实现并不总是有意义的。
据我所知,命令装饰器实现不能IValidator<TCommand>
作为构造函数 arg,除非每个ICommandHandler<TCommand>
都有相应的 FV。IValidator<TCommand>
. 我尝试了以下方法:
运行Container.Verify()
一次的单元测试通过。Container.Verify()
多次运行的单元测试InvalidOperationException
在第二次调用时失败:
以下工作,以Container
为参数:
如果这个类不需要依赖 Simple Injector,我可以将它移到域项目中。该域已经依赖于 FluentValidation.net,因此可以对域有效性进行单元测试。我认为这个装饰器属于域,但它和它的单元测试项目都不依赖于 simpleinjector(或者应该必须,因为域不是组合根)。
有没有办法告诉 simpleinjector 只CommandHandler<TCommand>
用 a 装饰一个实例,FluentValidationCommandDecorator<TCommand>
如果有注册的实现IValidator<TCommand>
?
c# - 使用 SignalR 的简单注入器
我认为使用 SignalR 使用我自己的 IoC 会非常简单,也许是这样;很可能我做错了什么。这是我到目前为止的代码:
然后是我的课:
最终发生的是我收到一个 IJavaScriptProxyGenerator 无法解决的错误,所以我想,我会添加注册:
但是还有很多其他人!我得到:
这仍然给了我“找不到类型的注册ITraceManager
”。...但是现在我想知道我是否完全正确地这样做了,因为我希望我不需要重新连接 SignalR 正在做的所有事情......对吗?希望?如果不是,我会继续跋涉,但我是 SignalR 和 Simple Injector 新手,所以我想先问一下。:)
附加:https ://cuttingedge.it/blogs/steven/pivot/entry.php?id= 88 因为 SignalR 有多个构造函数。
.net - 如何配置 Simple Injector IoC 以使用 RavenDB
我在 MVC 3 Web 应用程序中将Simple Injector用于 IOC。我正在使用RavenDB进行数据存储。在 mvc 3 应用程序中使用 RavenDB 有几个注意事项。我已经搜索了一些关于如何连接 IoC 以使用 RavenDB,但还没有找到如何连接简单注入器以使用 RavenDB。谁能解释如何连接简单的注入器以在 MVC 3 Web 应用程序中使用 RavenDB?
谢谢。
c# - 简单注入器:跨同一图的服务注入相同的 UnitOfWork 实例
我有多个服务,每个服务都使用Simple Injector IoC 容器UnitOfWork
注入到构造函数中。
目前我可以看到每个UnitOfWork
实例都是一个单独的对象,这很糟糕,因为我正在使用实体框架并且需要跨所有工作单元的相同上下文引用。
如何确保UnitOfWork
每个解析请求都将相同的实例注入所有服务?命令完成后,我UnitOfWor
将由外部命令处理程序装饰器保存。
请注意,这是一个通用库,将用于 MVC 和 Windows 窗体,如果可能的话,最好为这两个平台提供通用解决方案。
代码如下:
下面一行的预期结果是创建一个对象,该对象在整个构建的对象图中具有一个共享的 UnitOfWork 实例:
以下是我的服务:
c# - 对不同命令使用不同装饰器的简单注入器
嗨,我开始在我的所有项目中使用Simple Injector DI 容器,并且想要一些关于如何适应我的要求的强大功能的建议。
我有几个命令处理程序装饰器将包装命令:
互斥装饰器:
在某些情况下,仅以这种阻塞方式包装一些命令(通过使用 TransactionCommandHandlerWithMutexDecorator)才有意义,并允许其他人在所有线程中不受限制地访问(使用 TransactionCommandHandlerDecorator),此外,如果互斥锁不在命令类型之间共享会很好 - 使用我当前的代码,锁是静态的,将在所有类型之间共享。
所以关于我的问题:
1) 我如何将 TransactionCommandHandlerWithMutexDecorator 应用于特定的命令或命令,其余的使用 TransactionCommandHandlerDecorator - 我会使用 ExpressionBuilt 事件吗?
2)我是否需要为我希望装饰的每个命令创建一个新类(以确保每个命令都有一个唯一的锁定对象),还是有更好的方法(使用拦截)?
感谢有关执行上述操作的最佳方法的建议。
谢谢,
克里斯
c# - 如何配置 Simple Injector 在 ASP.NET MVC 中运行后台线程
我正在使用 Simple Injector 来管理我注入的依赖项的生命周期(在这种情况下UnitOfWork
),我很高兴拥有一个单独的装饰器,而不是我的服务或命令处理程序来处理保存和处理,这使得编写业务逻辑时代码更容易层(我遵循这篇博文中概述的架构)。
通过在组合根容器的构造过程中使用 Simple Injector MVC NuGet 包和以下代码,上述工作完美(并且非常容易),如果图中存在多个依赖项,则将同一实例注入所有对象 - 非常适合实体框架模型上下文。
我现在需要运行一些后台线程,并从关于线程的 Simple Injector 文档中了解命令可以被代理如下:
ThreadedCommandHandlerProxy:
但是,从这个线程示例文档中,我可以看到使用了工厂,如果我将工厂引入我的命令和服务层,事情会变得混乱和不一致,因为我将为不同的服务使用不同的保存方法(一个容器处理保存,其他实例化的工厂在services 处理保存和处理) - 您可以看到服务代码框架在没有任何工厂的情况下是多么清晰和简单:
有了上面我的问题开始形成,正如我从ASP .NET PerWebRequest生命周期的文档中了解到的那样,使用了以下代码:
以上对于每个 HTTP 请求都可以正常工作HttpContext.Current
,但是如果我使用它启动一个新线程,ThreadedCommandHandlerProxy
它将创建一个新线程,并且该线程HttpContext
中将不再存在。
由于HttpContext
在每次后续调用中 都将为空,因此注入服务构造函数的所有对象实例都是新的和唯一的,这与每个 Web 请求的正常 HTTP 相反,其中对象在所有服务中作为同一个实例正确共享。
因此,将以上内容总结为问题:
无论是从 HTTP 请求还是通过新线程创建的,我将如何获取构造的对象和注入的公共项目?
UnitOfWork
在命令处理程序代理中由线程管理是否有任何特殊注意事项?在处理程序执行后如何确保它被保存和处理?
如果我们在命令处理程序/服务层中遇到问题并且不想保存UnitOfWork
,我们会简单地抛出异常吗?如果是这样,是否有可能在全局级别捕获它,或者我们是否需要从处理程序装饰器或代理中的try
-中捕获每个请求的异常?catch
谢谢,
克里斯
asp.net-mvc - 无法使用简单注入器为每个请求创建 DbContext
尝试注册我的 DbContext 时,Simple Inject 引发以下异常。
提供的连接字符串无效,因为它包含的映射或元数据信息不足。参数名称:连接字符串
我是 DI 的新手,可能会遗漏一些相当明显的东西。连接字符串看起来不错。它与通常用于创建 DbContext 的相同。我在这里尝试解决方案
更新:我仍然没有解决我的问题,但它与Ninject的这个问题非常相似
堆栈跟踪:
.net - 带有简单注入器的 IoC 任务调度程序设计和代码示例建议
嗨,我正在使用Simple Injector,我正在尝试实现一个调度程序服务,该服务以可编程的常规频率调用命令。我的设计决策如下:
1)我有一个运行后台线程并从容器解析ICommandHandler<SyncExternalDataCommand>.Handle(someParameter)
并调用命令句柄方法的服务。
RegisterCommandAsBusinessUnitCronJob
将为每个 BusinessUnit 调用,并在每次调用时将 ID 作为参数传递。我们还可以实现RegistercommandAsCustomerContactCronJob
遍历客户记录。
用后台线程这样设计调度器可以吗?
2)我试图将组合根容器和调度程序之间的耦合保持在最低限度。
使用 Action 助手委托的方法有助于将代码保留在组合根部分中,而不是在服务中。通过使用不同的设计,这种耦合是否可以进一步减少,或者这种耦合是否可以接受?
代码如下(它尚未成为线程安全的),非常欢迎对上面的设计决策和改进/重新设计发表评论。
谢谢,克里斯
容器的引导
调度服务
c# - 构建对象图时的简单注入器集属性
使用Simple Injector我在记录器中遇到了一个共同的主题,我在记录器注入到的服务对象的构造函数中设置记录器名称。当服务写入日志时,可以通过此日志名轻松识别。
由于LogNames
将为每个服务设置,因此每个对象图请求的记录器应该是唯一的。
我想在构建图表时自动执行此操作,我已经四处寻找,ExpressionBuilt()
但我正在努力,但还没有得到我想要的工作 - 这甚至可能(或者想做的事情)?
我的构造函数代码如下(此LogName
属性设置代码在我的大多数服务中都很常见)。
谢谢,
克里斯