gpt4 book ai didi

inversion-of-control - 使用 Unity IOC 时出现 StackoverflowException

转载 作者:行者123 更新时间:2023-12-01 19:21:05 25 4
gpt4 key购买 nike

我在 Winforms 应用程序中使用 Unity,将依赖项注入(inject)到表单的构造函数中(我知道这不是最佳实践),但它确实有效,但当我尝试加载 mdi 表单时,出现了 stackoverflowException。

有什么方法可以追踪 Unity 试图解决的问题并以某种方式找出正在发生的情况吗?

我有一个工作示例,我知道它可以使用这种“设计”。

我知道这不是一个理想的设计,我计划引入一个演示者,但现在这应该可行,但我不知道为什么不行

编辑:我知道我有相互引用的服务,例如

public class Service1(IService2, IService3, IService4):IService1

public class Service2(IService1, IService5):IService2

这会导致异常吗?

EDIT2:是的,我刚刚使用我的第一次编辑中列出的循环引用创建了一个快速应用程序,并且我得到了 StackOverflowException - 显然是不允许的。

最佳答案

当你在 VS 中捕获异常时,进入它并按照 InnerException 操作。 Unity 应该打印所有已注册的类型,您可以看到缺少哪些类型。

还要查看堆栈跟踪。通常StackOverflow当你有这样的循环依赖时会出现:

class A { A(B b) { ... } }
class B { B(A a) { ... } }

A取决于B反之亦然。 Unity将尝试注入(inject)ctorA一个B实例但是一个 B实例需要 A实例,再次需要 B等等。

这个例子很简单,但在实际工作中,循环性更难发现,因为不同库之间可能存在更复杂的依赖关系图,例如 A -> B -> C -> D -> A (其中“->”表示“取决于”)。

编辑是的,如果此时您正在解决 IService1 ,那么交叉引用服务可能会导致您出现 stackoverflow 异常。 , IService1本身尚未注册;

解决方案1如果类型注册和解析分两步进行(粗略的想法),则可以绕过此问题:

  1. 注册同时注册IService1及其类型和 IService2及其类型。这一步只做注册代码,不处理任何其他事情(UI、启动逻辑、统一解析、http 通信等)。

  2. 实际应用逻辑开始;现在你可以解决任何问题。

解决方案2

使用空ctors并在 Service 内进行解析类(class)。您可以使用RegisterType方法指定空 ctor必须调用:

container.RegisterType<IServiceProvider, ServiceContainer>(new InjectionConstructor());

以下是有关 circular references with dependency injection using Unity. 的更多详细信息

解决方案3

使用Lazy<IService>来解决。使用此功能,实际解析将根据需要进行,第一次时更具体 Lazy.Value属性第一次被调用。

关于inversion-of-control - 使用 Unity IOC 时出现 StackoverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33100784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com