关键字:

Unity .NET5 .NET6 循环引用 循环依赖 Quartz StdSchedulerFactory

起因

在.NET6/.NET5环境中,使用Unity替换默认容器,用到了Quartz任务管理,发现在注册ISchedulerFactory为StdSchedulerFactory后,获取ISchedulerFactory会报错:

System.StackOverflowException:“Exception_WasThrown”

根据报错推测是产生了循环引用,导致堆栈溢出;

进一步尝试发现不用Unity用默认容器,没有这个问题;

直接看解决方法,到文章末尾。

重现

定义测试实体

public class TestModel
{
public string Code { get; set; } public string Name { get; set; } public TestModel()
{
} //自身引用; 注意这里
public TestModel(TestModel model)
{
this.Code = model.Code;
this.Name = model.Name;
}
}

定义接口及实现

public interface ITest
{
string Hello(string name);
} public class TestImpl : ITest
{
public TestImpl()
{
} //用unity容器时,model定义成循环引用了,会报错
public TestImpl(TestModel model)
{
} public string Hello(string name)
{
return $"Hello, {name}";
}
}

应用

注册及获取ITest

默认容器运行正常

引用unity容器:略

再次运行,报错

解决

这是个很“奇怪”的问题,接口实现类TestImpl,因为有一个“没用到”的构造函数,其参数TestModel有一个“没用到”的构造函数,引用自身;会导致Unity容器获取该接口时报错。好绕,看图。

看“起因”Quartz中的接口实现StdSchedulerFactory,NameValueCollection有引用自身的构造函数。

解决办法:删除接口实现中的带参构造函数或自身引用的构造函数都可以;但在涉及三方dll的时候不方便。

更好的办法:对自身引用的参数做下注册。

public void ConfigureServices(IServiceCollection services)
{
//添加TestModel注册
services.AddTransient(typeof(TestModel), _ => new TestModel()); //注册ITest
services.AddScoped<ITest, TestImpl>();
}

添加注册之后,运行正常。

Unity容器构造函数参数循环引用问题及解决的更多相关文章

  1. NSTimer定时器进阶——详细介绍,循环引用分析与解决

    引言 定时器:A timer waits until a certain time interval has elapsed and then fires, sending a specified m ...

  2. CADisplayLink使用中的循环引用问题的解决

    解决循环引用的问题,参考学习了ibireme大神的YYFPSLabel的实现,整理以备用 // 如果直接用 self 或者 weakSelf,都不能解决循环引用问题 _link = [CADispla ...

  3. ios 中的循环引用问题及解决

    循环引用,指的是多个对象相互引用时,使得引用形成一个环形,导致外部无法真正是否掉这块环形内存.其实有点类似死锁. 举个例子:A->B->C->....->X->B   - ...

  4. EF 多对多循环引用序列化失败 解决办法

    错误:Self referencing loop detected with type 'System.Data.Entity.DynamicProxies.tbldph_901D48A194FB31 ...

  5. Spring IOC 源码简单分析 03 - 循环引用

    ### 准备 ## 目标 了解 Spring 如何处理循环引用 ##测试代码 gordon.study.spring.ioc.IOC03_CircularReference.java   ioc03. ...

  6. Block的使用及循环引用的解决

    Block是一个很好用的东西,这篇文章主要来介绍:1.什么是Block?2.Block的使用?3.Block的循环引用问题及解决. 1.什么是Block? 说这个问题之前,我先来说一下闭包(Closu ...

  7. iOS - Block产生Memory Leaks循环引用导致的内存泄漏以及解决方案

    在ARC(自动引用技术)前,Objective-c都是手动来分配释放 释放 计数内存,其过程非常复杂. ARC技术推出后,貌似世界和平了很多,但是其实ARC并不等同于Java或者C#中的垃圾回收,AR ...

  8. iOS之weak和strong、懒加载及循环引用

    一.weak和strong 1.理解 刚开始学UI的时候,对于weak和strong的描述看得最多的就是“由ARC引入,weak相当于OC中的assign,但是weak用于修饰对象,但是他们都不会造成 ...

  9. 第3月第9天 循环引用 block

    一.一个对象没有被引用,那么在函数块完成时就会被dealloc,这种情况因为对象销毁了,block块也永远不会执行. MyNetworkOperation *op = [[MyNetworkOpera ...

随机推荐

  1. actf2020 exec

    actf2020 exec 1.根据提示,ping一个127.0.0.1,有回显,ls一下发现index.php 3.方向找错了,绕了一大圈,还cat了index.php也没发现什么 最后没招了,回原 ...

  2. RichTextBox单独设置文字颜色

    richTextBox1.Select(index, "str1".Length); richTextBox1.SelectionColor = Color.Red;

  3. 【解决了一个小问题】golang build中因为缓存文件损坏导致的编译错误

    编译的过程中出现了一个吓人的错误: GOROOT=C:\Go #gosetup GOPATH=C:\Users\ahfuzhang\go #gosetup C:\Go\bin\go.exe mod t ...

  4. 【记录一个问题】opencl的clGetPlatformIDs()在cuda 9下返回-1001(找不到GPU平台)

    如题:在cuda9, nvidia驱动版本 384.81 的环境下运行opencl程序,在clGetPlatformIDs()函数中返回-1001错误. 把环境更换为cuda 10,驱动版本410.1 ...

  5. Qt之信号与槽

    student.h: #ifndef STUDENT_H #define STUDENT_H #include <QObject> class Student:public QObject ...

  6. go get失败解决办法

    go get时由于防火墙的原因,会导致失败.目前可以通过修改GOPROXY的方法解决该问题. 无论是在win下还是linux,macos下,只需要将环境变量GOPROXY设置成https://gopr ...

  7. Go 变量及基本数据类型1

    #### Go 变量及基本数据类型(一)今天主要学习一下Go 中的变量及基本数据类型: 如何申明,使用变量,以及基本数据类型的介绍和使用细节; ##### 变量的介绍1. 变量相当于内存中一个数据存储 ...

  8. 基于Redis&MySQL接口幂等性设计

    基于Redis&MySQL接口幂等性设计 欲把相思说似谁,浅情人不知. 1.幂等 幂等性即多次调用接口或方法不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致. 2.幂等使用场景 前 ...

  9. 论文笔记——事件抽取之DMCNN

    1.事件抽取介绍: 事件在不同领域中有着不同的含义,对于事件目前还没有统一的定义.在IE ( Information Extraction) 中,事件是指在某个特定的时间片段和地域范围内发生的,由一个 ...

  10. Hexo博客(Snail主题)搭建回顾概览

    Hexo博客(Snail主题)搭建回顾概览 笔者搭建博客地址:https://saltyfishyjk.github.io 目录 Hexo博客(Snail主题)搭建回顾概览 Part 0 前言 写作背 ...