问题标签 [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.

0 投票
1 回答
2324 浏览

mapping - 简单的注入器注册 IMappingEngine (AutoMapper)

我以前使用过 Autofac,但现在我想试试 SimpleInjector。我的问题是,在我的方法中调用 mappingEngine 时出现以下错误:

缺少类型映射配置或不支持的映射。

映射类型:Something -> SomethingDto 目标路径:IEnumerable`1[0]

源值:

Mapper.Map 不是我想要的。我在这里基于此注册 Automapper:

将 Ninject 替换为 Simple Injector


我的问题是,如何在 SimpleInjector 中注册 IMappingEngine 并正确添加我的配置文件?

提前致谢!

迎接 mtrax

0 投票
1 回答
204 浏览

.net - 使用 SimpleInjector 处理数据库连接错误的结构

我有一个实体框架应用程序连接到一个单独的盒子上的 SQL 服务器。程序流程可以分为两种状态:

  1. 使用 Simple Injector DI 框架初始化组合根和注册类型
  2. 初始化应用程序(使用实体框架对 SQL 数据库进行一些读写操作)
  3. 基于计时器,任务函数获取即将运行的命令的实例ICommandHandler<CommandType>(命令类型不同)
  4. 调用Handle(commandType)此实例以运行命令
  5. 返回第 3 步

我需要保护程序在失去与 SQL 服务器的连接时崩溃。目前,如果应用程序失去 SQL 连接,将抛出未处理的异常EntityException - The underlying provider failed on Open

一旦服务器重新联机,该程序应该能够重置和恢复操作。

这个问题涉及到 Simple Injector 的使用,因为它是我的应用程序的核心,我对编写未初始化和运行状态之间的状态转换有一些想法,但想首先询问应该在哪里以一种很好的方式捕获错误使用Simple Injector 的功能 - 具体来说,我专注于装饰器,但不确定这是否正确。

对任何其他推荐架构开放,以及从更高级别捕获错误的位置来看这可能会如何,从而允许发生状态更改。

下面的代码结构

我正在使用命令/处理程序方法:

在应用程序启动时,所有实现的类型ICommandHandler<T>都被注册:

我的命令处理程序实现如下:

然后,我可以使用 Simple Injector 获取类型的实例,例如,将返回ICommandHandler<AddBusinessUnitCommand>一个实例化的对象,允许我执行命令。BusinessUnitCommandHandlersHandle()

我已经看到 Simple Injector 可以使用装饰器来包装Handle()过程调用。

0 投票
0 回答
509 浏览

dependency-injection - 简单的注入器 ASP.NET MVC 发布表单结果错误

我是使用简单注入器的新手,按照 codeplex 和 nuget 包指南中的说明注册所有实例。当我单击链接时,一切正常,这与没有表单返回结果的操作有关。

当我有一个输入了一些数据的表单并在单击提交按钮后,对于任何 get 或 post 方法,我都有一个错误,例如容器未初始化:

“没有为此对象定义无参数构造函数。”

无法弄清楚为什么会这样。

0 投票
2 回答
641 浏览

.net - 在 SimpleInjector 中基于泛型类型约束条件注册命令装饰器

如何在中注册条件装饰SimpleInjector?这是我的定义:

我正在尝试:

0 投票
1 回答
1781 浏览

dependency-injection - SimpleInjector - 为它的所有接口注册一个类型

是否可以为所有它实现的接口注册一个类型?例如,我有一个:

0 投票
1 回答
6204 浏览

c# - 使用 Simple Injector 实现每个线程和每个 Web 请求的混合生活方式

我正在SimpleInjector用作我的 IoC 库。我DbContext根据网络请求注册,它工作正常。但是有一项任务是我在后台线程中运行的。所以,我在创建DbContext实例时遇到了问题。例如

  1. Service1有一个实例DbContext
  2. Service2有一个实例DbContext
  3. Service1Service2从后台线程运行。
  4. Service1获取一个实体并将其传递给Service2
  5. Service2使用该实体,但实体与DbContext

实际上问题就在这里:Service1.DbContextService2.DbContext.

似乎当我在 ASP.NET MVC 的单独线程中运行任务时,会为每个调用SimpleInjector创建一个新实例。DbContext虽然一些 IoC 库(例如StructureMap)对 per-thread-per-webrequest 有一种混合的生活方式,但似乎SimpleInjector没有。我对吗?

你有什么想法解决这个问题SimpleInjector吗?提前致谢。

编辑:

我的服务在这里:

Service2有时和AsyncService2其他时间用户。

0 投票
1 回答
2573 浏览

c# - 使用 MVC 3 控制器的依赖注入的命令模式

我阅读了以下文章.NET Junkie - 同时...在我的架构的命令方面,这是由另一个 stackoverflow 用户提出的,该用户概述了命令模式并在文章末尾提供了如何将其与 DI 一起使用的策略。

这有很大帮助,但我缺少的一件事,假设我创建了一个名为CheckoutCustomerCommandHandler.

现在,假设MoveCustomerCommandHandler无论出于何种原因,我都需要通过构造函数将此命令和 注入控制器。这对 DI 容器设置和构造函数有何影响?

在核心,它们都实现了相同的接口。这似乎会导致 DI 容器的查找问题。在文章示例中,这是他们的样品注射器设置:

0 投票
1 回答
917 浏览

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, Expression1 谓词) +265

MyProject.MyRoleProvider.IsUserInRole(String username, String roleName) in ...

System.Web.Security.Roles.IsUserInRole(字符串用户名,字符串角色名称)+263

MyProject.MyPrincipal.IsInRole(字符串角色)在...

System.Linq.Enumerable.Any(IEnumerable 1 source, Func2 谓词)+146

System.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 启动它们?

0 投票
1 回答
1363 浏览

c# - 简单的注入器打开通用装饰器

我正在尝试利用简单注射器中的一些不错的功能。

我目前在装饰器方面遇到问题,当我期望它们时,它们也没有受到打击。

我正在像这样注册它们:

我想我一定错过了一些东西,因为我期望调用ICommandHandler<CreateProductCommand>将在CreateValidFriendlyUrlCommandHandler<>运行CreateProductValidationCommandHandler<>之前调用。

我尝试过这样的不同注册:

正如我所想的那样,当and实现可能会遇到一些循环引用时ICommandHandler<CreateProductCommand>,为类型注册一个装饰器。ICommandHandler<CreateProductCommand>CreateProductValidationCommandHandlerCreateValidFriendlyUrlCommandHandlerICommandHandler<CreateProductCommand>

但改变这一点并没有什么不同。

这是我的CreateProductValidationCommandHandler<TCommand>

这是我的CreateValidFriendlyUrlCommandHandler<TCommand>

0 投票
4 回答
414 浏览

c# - 使用 IoC 链接层,将 lower 回调设置为 upper 并避免循环引用

我有一个场景,我需要下层由上层控制,就像木偶大师拉弦一样。

由于不时产生一些内部事件,下层也会回调上层。

我正在使用 SimpleInjector,我将 ILower 注入到 Upper 构造函数中。我不能将 Upper 注入到 Lower 中,因为它会导致循环引用。

相反,我有一个注册回调函数来链接两个层。但是,我必须使用空检查来分散我的代码。

有没有更好的方法或不同的架构来实现对象的这种链接?