Unity容器构造函数参数循环引用问题及解决
关键字:
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容器构造函数参数循环引用问题及解决的更多相关文章
- NSTimer定时器进阶——详细介绍,循环引用分析与解决
引言 定时器:A timer waits until a certain time interval has elapsed and then fires, sending a specified m ...
- CADisplayLink使用中的循环引用问题的解决
解决循环引用的问题,参考学习了ibireme大神的YYFPSLabel的实现,整理以备用 // 如果直接用 self 或者 weakSelf,都不能解决循环引用问题 _link = [CADispla ...
- ios 中的循环引用问题及解决
循环引用,指的是多个对象相互引用时,使得引用形成一个环形,导致外部无法真正是否掉这块环形内存.其实有点类似死锁. 举个例子:A->B->C->....->X->B - ...
- EF 多对多循环引用序列化失败 解决办法
错误:Self referencing loop detected with type 'System.Data.Entity.DynamicProxies.tbldph_901D48A194FB31 ...
- Spring IOC 源码简单分析 03 - 循环引用
### 准备 ## 目标 了解 Spring 如何处理循环引用 ##测试代码 gordon.study.spring.ioc.IOC03_CircularReference.java ioc03. ...
- Block的使用及循环引用的解决
Block是一个很好用的东西,这篇文章主要来介绍:1.什么是Block?2.Block的使用?3.Block的循环引用问题及解决. 1.什么是Block? 说这个问题之前,我先来说一下闭包(Closu ...
- iOS - Block产生Memory Leaks循环引用导致的内存泄漏以及解决方案
在ARC(自动引用技术)前,Objective-c都是手动来分配释放 释放 计数内存,其过程非常复杂. ARC技术推出后,貌似世界和平了很多,但是其实ARC并不等同于Java或者C#中的垃圾回收,AR ...
- iOS之weak和strong、懒加载及循环引用
一.weak和strong 1.理解 刚开始学UI的时候,对于weak和strong的描述看得最多的就是“由ARC引入,weak相当于OC中的assign,但是weak用于修饰对象,但是他们都不会造成 ...
- 第3月第9天 循环引用 block
一.一个对象没有被引用,那么在函数块完成时就会被dealloc,这种情况因为对象销毁了,block块也永远不会执行. MyNetworkOperation *op = [[MyNetworkOpera ...
随机推荐
- Unity3D开发入门教程(三)——添加启动脚本
五邑隐侠,本名关健昌,12年游戏生涯. 本教程以 Unity 3D + VS Code + C# + tolua 为例. 一.启动脚本 第一篇 "搭建开发环境",在 "配 ...
- func-spring-boot-starter 快速上手
func-spring-boot-starter test 项目地址 func-spring-boot-starter项目地址: https://gitee.com/yiur/func-spring- ...
- day2 数组字符串逆序存放正序对接调试
这个问题仔细想了想,是s,t,s[],t[],重定义了,导致输入的是s,t这个定义变量,与传参传的是指针变量就不匹配了. 如果加上对s,t的地址,让传参的形式想匹配,还是报错,这块也没有弄懂,初步觉的 ...
- MVC框架---转
浅析MVC模式 摘要:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面 ...
- 使用EdgyGeo Cesium工具查询下载数据集
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ EdgyGeo, Inc. 带来了一件非常棒的工作支撑架构.工程 ...
- 话说C#程序员人手一个ORM
话说C#程序员人手一个ORM,确实没有必要再写ORM了,不过我的ORM并不是新的,是从DBHelper演化过来的,算是DBHelper魔改版. 目前流行的ORM有EF.Dapper.SqlSugar. ...
- 全网最全的Java SpringBoot点赞功能实现
前言 最近公司在做一个NFT商城的项目,大致就是一个只买卖数字产品的平台,项目中有个需求是用户可以给商品点赞,还需要获取商品的点赞总数,类似下图 起初感觉这功能很好实现,无非就是加个点赞表嘛,后来发现 ...
- 加深对AQS原理的理解示例一:实现一个独占锁
/** *@Desc * 这个自定义的独占锁 只是一个简单的版本,非常粗糙,只为了加深对AQS原理理解.但还有一些列问题有待解决,比如锁的重入,锁不允许被其他线程中断等! *@Author zhang ...
- golang中的切片
1. 切片中追加数据,如果没有扩容,内存地址不发生变化 // 1. 切片中追加数据,如果不扩容的话,内存地址不发生变化 v1 := make([]int, 1, 3) v2 := append(v1, ...
- python3 requests的content和text方法
text返回的是Unicode型的数据 content返回的是是二进制的数据. 也就是说,如果你想取文本,可以通过r.text. 如果想取图片,文件,则可以通过r.content >>&g ...