问题标签 [light-inject]
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.
c# - LightInject IoC 容器在解析类型时抛出 stackoverflow
在尝试 LightInject IoC 容器http://www.lightinject.net/时,它会在解析 ISomeService 类型时引发 stackoverflow 异常:
所有类型都在 App_Start 中注册:
然后,当我尝试在控制器中解决它时,它会失败并引发 stackoverflow 异常:
使用ServiceLocator时也出现同样的错误:
我已经对其进行了跟踪,并且可以看到它在此处的 LightInject ServiceContainer 类中失败了,但我不明白它为什么会失败。
调用 GetDefaultDelegate 后,执行路径又回到 GetInstance 结束,导致无限循环和堆栈溢出。
编辑 2 - 进一步追踪了这一点,它似乎是由 SomeService 同时具有构造函数和属性注入引起的:
依赖 IAnotherService AnotherService 正在通过构造函数和属性注入,但无意使用属性注入器。
编辑 3
应用程序中有几个层都使用 ServiceLocator,所以我最初使用 NuGet 将 LI 添加到它自己的项目中,所以我有:
但实际上并不需要将其添加到自己的项目中,因为可以在 UI 层中设置服务定位器提供程序:
所以我刚刚删除了额外的项目并将 NuGet 包放入 UI 层。我还安装了 LightInject.Annotation 并故意不调用 container.EnableAnnotatedPropertyInjection() 方法,以确保仅使用构造函数注入。它仍然抛出一个stackoverflow。
为了测试解析是否有效,我只是在我的 HomeController.Index() 方法中执行此操作:
我向 ServiceController.GetInstance 方法添加了一些控制台日志记录,以便我可以看到导致 stackoverflow 的方法调用流。这是日志,结果有点出乎意料。您可以看到,当它为 ISomeService 调用 CreateDelegate() 时,它最终会首先尝试获取 HomeController 的实例——这是为什么呢?
当我注释掉服务的构造函数时,解析工作和所有依赖项都通过属性注入解决。如果包含构造函数,则它会引发 stackoverflow 异常。
尽管解析 ISomeService 仅在使用属性时有效,但如果该服务在其依赖项中包含 ISomeService,我将无法解析 IAnotherService。我希望上面的日志能对这个问题有所了解。迄今为止,LightInject 的性能已经明显优于 Unity
inversion-of-control - Unity 有 CreateChildContainer,SimpleInjector 或 LightInject 中是否有等价物
我们正在评估 SimpleInjector 和 LightInject 以在我们的应用程序中替换我们当前的 Unity 实现。Unity 有一个方法允许通过调用 CreateChildContainer() 实现容器层次结构。是否有 SimpleInjector 和 LightInject 的等价物?
c#-4.0 - 在传递构造函数参数时在 LightInject 中注册服务时指定生命周期?
使用 LightInject,假设我有一个要注册多个构造函数参数的服务,例如:
我正在努力弄清楚如何在注册期间指定 ILifetime 实例。使用简单的注册,我可以设置 ILifetime 进行简单的注册,如下所示:
似乎所有使用工厂的 Register 方法都假定了瞬态对象。
我可以为参数创建另一个接口并注册它,但我不想为每个在构造函数中使用多个参数的单个实例创建新的东西。
那么,如何注册一个工厂和终身的服务呢?
我承认我对 IoC/DI 有点陌生,所以这可能只是因为我误解了如何正确完成这项任务,我相信还有另一种方法可以做到这一点。
c# - Lightinject 类似 Windsor 的 Kernel_ComponentRegistered
我正在关注教程依赖注入和使用 Castle 的工作单元。我在我的项目中使用 lightinject,所以我使用 ICompositionRoot 而不是 IWindsorInstaller。
问题是我找不到类似 Kernel_ComponentRegistered 的方法来添加拦截器。我如何在 lightinject 中做到这一点?
ioc-container - 使用 LightInject 和 Nsubstitute 进行自动模拟,怎么样?
我对这两个库都是新手,在将它们用于大型项目之前,我需要澄清我的单元测试中低代码工作量自动模拟的选项。
在 Google 上花了一些时间后,我得出的结论是,与其他一些 IOC/Mocking 产品配对不同,LightInject+Nsubstitute 没有现成的插件库来简化在一个单元的排列阶段的无操作默认模拟的声明测试。
我已经阅读了 LightInject 文档,了解如何使用临时增强的模拟对象覆盖 LightInject 容器,仅用于单元测试的范围,但是单元测试可能涉及的所有无操作默认隔离模拟呢?有没有办法在 LightInject 容器中自动创建它们?
我正在寻找的内部 IOC 容器行为是:
看起来 LightInject 的 IProxy 和 Interceptors 提供了一些内部模拟对象构建块,但相比之下 Nsubstitute 库功能齐全。
澄清我的意思是默认不做任何模拟和增强模拟。
显然,第二种增强类型的模拟将需要在每个单元测试中本地制作。
light-inject - DependencyResolver 的 LightInject 问题
我已经将 lightinject 的配置写到了一个单独的类中。
在 Global.ascx Application Start 我有
我的 LightInjectDependencyResolver 类看起来像:
我收到带有错误的黄屏死机:
无法解析类型:System.Web.Mvc.IControllerFactory,服务名称:
编辑
我想我已经对其进行了排序,基本上我不需要 DependecnyReolver 并且看起来它在内部执行此操作。因此,您仍然可以执行以下操作:
c# - 如何在lightinject中拦截一个工厂
不知道在这里做什么。尝试拦截具有构造函数注入的工厂时,invocationInfo.Proceed() 总是失败。
在我的拦截器中使用此方法失败。
例外:
LightInject.dll 中出现“System.InvalidCastException”类型的异常,但未在用户代码中处理
附加信息:无法将“System.Func`1[ConsoleApplication1.IAwesome]”类型的对象转换为“System.Object[]”类型。
抱歉,我无法为 Lightinject 创建新标签。没有足够的代表:/
c# - 为什么 LightInject 使用 ImmutableHashTree 来存储注册,而不是简单的 Dictionary?
我正在查看几个 IoC 包含以便选择一个用于我的工作,并查看 LightInject 的代码库,我遇到了一些我不明白的东西......
在 ServiceContainer 的GetInstance(Type serviceType, string serviceName)
方法中,它从参数形成一个键并在“namedDelegates”上调用“Search”:
namedDelegates 是ImmutableHashTree<TKey, TValue>
一个内部类,它实现(来自它自己的注释):
我之所以关注 LightInject 是因为它在Daniel Palme 的 IoC 性能比较中取得了优异的成绩,我很困惑为什么在这种情况下使用 O(log n) 二进制搜索算法优于使用 O(1) 字典?
有人可以在这里教育我吗?
dependency-injection - LightInject vs (Ninject and Unity) 未注册类型解析
这对某些人来说可能很明显,但是......有没有办法用 LightInject 解决非注册类型?此外,在没有显式注入的情况下使用 DI 框架自动神奇地解析对象以提高可读性是一种好习惯吗?
在我的示例中,我将超级全功能框架(可能是最慢的)与最轻量(和最快)的框架之一进行比较。这不完全是一个错误:D
构造函数注入(无容器)
忍者
统一
光注入