问题标签 [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.
mapping - 简单的注入器注册 IMappingEngine (AutoMapper)
我以前使用过 Autofac,但现在我想试试 SimpleInjector。我的问题是,在我的方法中调用 mappingEngine 时出现以下错误:
缺少类型映射配置或不支持的映射。
映射类型:Something -> SomethingDto 目标路径:IEnumerable`1[0]
源值:
Mapper.Map 不是我想要的。我在这里基于此注册 Automapper:
我的问题是,如何在 SimpleInjector 中注册 IMappingEngine 并正确添加我的配置文件?
提前致谢!
迎接 mtrax
.net - 使用 SimpleInjector 处理数据库连接错误的结构
我有一个实体框架应用程序连接到一个单独的盒子上的 SQL 服务器。程序流程可以分为两种状态:
- 使用 Simple Injector DI 框架初始化组合根和注册类型
- 初始化应用程序(使用实体框架对 SQL 数据库进行一些读写操作)
- 基于计时器,任务函数获取即将运行的命令的实例
ICommandHandler<CommandType>
(命令类型不同) - 调用
Handle(commandType)
此实例以运行命令 - 返回第 3 步
我需要保护程序在失去与 SQL 服务器的连接时崩溃。目前,如果应用程序失去 SQL 连接,将抛出未处理的异常EntityException - The underlying provider failed on Open
。
一旦服务器重新联机,该程序应该能够重置和恢复操作。
这个问题涉及到 Simple Injector 的使用,因为它是我的应用程序的核心,我对编写未初始化和运行状态之间的状态转换有一些想法,但想首先询问应该在哪里以一种很好的方式捕获错误使用Simple Injector 的功能 - 具体来说,我专注于装饰器,但不确定这是否正确。
对任何其他推荐架构开放,以及从更高级别捕获错误的位置来看这可能会如何,从而允许发生状态更改。
下面的代码结构
我正在使用命令/处理程序方法:
在应用程序启动时,所有实现的类型ICommandHandler<T>
都被注册:
我的命令处理程序实现如下:
然后,我可以使用 Simple Injector 获取类型的实例,例如,将返回ICommandHandler<AddBusinessUnitCommand>
一个实例化的对象,允许我执行命令。BusinessUnitCommandHandlers
Handle()
我已经看到 Simple Injector 可以使用装饰器来包装Handle()
过程调用。
dependency-injection - 简单的注入器 ASP.NET MVC 发布表单结果错误
我是使用简单注入器的新手,按照 codeplex 和 nuget 包指南中的说明注册所有实例。当我单击链接时,一切正常,这与没有表单返回结果的操作有关。
当我有一个输入了一些数据的表单并在单击提交按钮后,对于任何 get 或 post 方法,我都有一个错误,例如容器未初始化:
“没有为此对象定义无参数构造函数。”
无法弄清楚为什么会这样。
.net - 在 SimpleInjector 中基于泛型类型约束条件注册命令装饰器
如何在中注册条件装饰器SimpleInjector
?这是我的定义:
我正在尝试:
dependency-injection - SimpleInjector - 为它的所有接口注册一个类型
是否可以为所有它实现的接口注册一个类型?例如,我有一个:
c# - 使用 Simple Injector 实现每个线程和每个 Web 请求的混合生活方式
我正在SimpleInjector
用作我的 IoC 库。我DbContext
根据网络请求注册,它工作正常。但是有一项任务是我在后台线程中运行的。所以,我在创建DbContext
实例时遇到了问题。例如
Service1
有一个实例DbContext
Service2
有一个实例DbContext
Service1
并Service2
从后台线程运行。Service1
获取一个实体并将其传递给Service2
Service2
使用该实体,但实体与DbContext
实际上问题就在这里:Service1.DbContext
与Service2.DbContext
.
似乎当我在 ASP.NET MVC 的单独线程中运行任务时,会为每个调用SimpleInjector
创建一个新实例。DbContext
虽然一些 IoC 库(例如StructureMap
)对 per-thread-per-webrequest 有一种混合的生活方式,但似乎SimpleInjector
没有。我对吗?
你有什么想法解决这个问题SimpleInjector
吗?提前致谢。
编辑:
我的服务在这里:
我Service2
有时和AsyncService2
其他时间用户。
c# - 使用 MVC 3 控制器的依赖注入的命令模式
我阅读了以下文章.NET Junkie - 同时...在我的架构的命令方面,这是由另一个 stackoverflow 用户提出的,该用户概述了命令模式并在文章末尾提供了如何将其与 DI 一起使用的策略。
这有很大帮助,但我缺少的一件事,假设我创建了一个名为CheckoutCustomerCommandHandler
.
现在,假设MoveCustomerCommandHandler
无论出于何种原因,我都需要通过构造函数将此命令和 注入控制器。这对 DI 容器设置和构造函数有何影响?
在核心,它们都实现了相同的接口。这似乎会导致 DI 容器的查找问题。在文章示例中,这是他们的样品注射器设置:
dependency-injection - SimpleInjector 和 System.Web.Mvc.Async 线程
我在这里问了一个问题,我读了这个关于多线程的问题/答案,我知道这些解决方案。但是今天我遇到了一个新问题。当我们使用命令(或者我们可以访问原始代码来管理和修改它的地方)时,上面答案中建议的 async-decorator 工作。但是当 MVC 自己创建一个新线程时,我们能做什么呢?例如,我有一个自定义角色提供者(与 一起使用DbContext
),我收到此错误:
操作无法完成,因为 DbContext 已被释放。
这是堆栈跟踪:
[InvalidOperationException:操作无法完成,因为 DbContext 已被释放。]
System.Data.Entity.Internal.InternalContext.CheckContextNotDisposed() +67
System.Data.Entity.Internal.LazyInternalContext.InitializeContext() +34
System.Data.Entity.Internal.Linq.DbQueryProvider.Execute(表达式表达式)+22
System.Linq.Queryable.Any(IQueryable
1 source, Expression
1 谓词) +265MyProject.MyRoleProvider.IsUserInRole(String username, String roleName) in ...
System.Web.Security.Roles.IsUserInRole(字符串用户名,字符串角色名称)+263
MyProject.MyPrincipal.IsInRole(字符串角色)在...
System.Linq.Enumerable.Any(IEnumerable
1 source, Func
2 谓词)+146System.Web.Mvc.AuthorizeAttribute.AuthorizeCore(HttpContextBase httpContext) +200
System.Web.Mvc.AuthorizeAttribute.OnAuthorization(AuthorizationContext filterContext) +159
System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext,IList`1过滤器,ActionDescriptor actionDescriptor)+96
System.Web.Mvc.Async。<>c__DisplayClass25.b__1e (AsyncCallback asyncCallback, Object asyncState) +446
System.Web.Mvc.Async。WrappedAsyncResult`1.Begin(AsyncCallback 回调,对象状态,Int32 超时)+130
System.Web.Mvc.Async。AsyncControllerActionInvoker.BeginInvokeAction (ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +302
系统.Web.Mvc。<>c__DisplayClass1d.b__17 (AsyncCallback asyncCallback, Object asyncState) +30
System.Web.Mvc.Async。WrappedAsyncResult`1.Begin(AsyncCallback 回调,对象状态,Int32 超时)+130
系统.Web.Mvc。Controller.BeginExecuteCore(AsyncCallback 回调,对象状态)+382
System.Web.Mvc.Async。WrappedAsyncResult`1.Begin(AsyncCallback 回调,对象状态,Int32 超时)+130
系统.Web.Mvc。Controller.BeginExecute(RequestContext requestContext,AsyncCallback 回调,对象状态)+317
System.Web.Mvc.Controller.System.Web.Mvc.Async。IAsyncController.BeginExecute(RequestContext requestContext,AsyncCallback 回调,对象状态)+15
系统.Web.Mvc。<>c__DisplayClass8.b__2 (AsyncCallback asyncCallback, Object asyncState) +71
System.Web.Mvc.Async。WrappedAsyncResult`1.Begin(AsyncCallback 回调,对象状态,Int32 超时)+130
系统.Web.Mvc。MvcHandler.BeginProcessRequest(HttpContextBase httpContext,AsyncCallback 回调,对象状态)+249
系统.Web.Mvc。MvcHandler.BeginProcessRequest (HttpContext httpContext, AsyncCallback 回调, 对象状态) +50
System.Web.Mvc.MvcHandler.System.Web。IHttpAsyncHandler.BeginProcessRequest(HttpContext上下文,AsyncCallback cb,对象extraData)+16
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
如您所见,MyProject.MyRoleProvider.IsUserInRole
异步调用,我没有启动它,它由 MVC 本身调用异步。所以我对此没有任何控制权。我的提供者 ctor 是:
公共 MyRoleProvider() { _context = MyIoCWrapper.GetService(); }
好像MyRoleProvider
实例化HttpContext
的时候不为null,IsInRole
调用的时候好像HttpContext
为null。如果我想开始一个新的生命范围,它只会被使用一次,如果 MVC 开始一个新线程,我也会有一个新的DbContext
。我很困惑找不到解决方案。你有吗?如何为所有后台线程开始一个新的生命范围 - 我启动它们还是 MVC 启动它们?
c# - 简单的注入器打开通用装饰器
我正在尝试利用简单注射器中的一些不错的功能。
我目前在装饰器方面遇到问题,当我期望它们时,它们也没有受到打击。
我正在像这样注册它们:
我想我一定错过了一些东西,因为我期望调用ICommandHandler<CreateProductCommand>
将在CreateValidFriendlyUrlCommandHandler<>
运行CreateProductValidationCommandHandler<>
之前调用。
我尝试过这样的不同注册:
正如我所想的那样,当and实现可能会遇到一些循环引用时ICommandHandler<CreateProductCommand>
,为类型注册一个装饰器。ICommandHandler<CreateProductCommand>
CreateProductValidationCommandHandler
CreateValidFriendlyUrlCommandHandler
ICommandHandler<CreateProductCommand>
但改变这一点并没有什么不同。
这是我的CreateProductValidationCommandHandler<TCommand>
:
这是我的CreateValidFriendlyUrlCommandHandler<TCommand>
:
c# - 使用 IoC 链接层,将 lower 回调设置为 upper 并避免循环引用
我有一个场景,我需要下层由上层控制,就像木偶大师拉弦一样。
由于不时产生一些内部事件,下层也会回调上层。
我正在使用 SimpleInjector,我将 ILower 注入到 Upper 构造函数中。我不能将 Upper 注入到 Lower 中,因为它会导致循环引用。
相反,我有一个注册回调函数来链接两个层。但是,我必须使用空检查来分散我的代码。
有没有更好的方法或不同的架构来实现对象的这种链接?