旧Asp.Net应用升级Unity至最新版后出现ResolutionFailedException求助
解决Unity更新后出现的ResolutionFailedException问题
嘿,这个问题我之前升级Unity的时候也碰到过!核心原因是新版Unity对属性注入的规则收紧了——旧版本可能睁一只眼闭一只眼允许给没有setter的属性注入依赖,但现在它严格要求要注入的属性必须有可访问的setter方法。
咱们一步步来解决:
1. 先排查属性定义问题
打开DAL.Repositories.SomeRepository类,找到那个converter属性,大概率是写成了下面这种只有getter的形式:
public IConverter converter { get; }
这种属性是只读的,Unity新版本根本没法给它赋值,自然就抛出异常了。
2. 两种修复方案任你选
方案一:给属性添加public setter
最简单的办法就是把属性改成带public setter的:
public IConverter converter { get; set; }
这样Unity就能正常完成属性注入了。
方案二:改用构造函数注入(更推荐)
如果不想暴露public setter(毕竟破坏封装性),那强烈建议换成构造函数注入——这本来就是依赖注入的最佳实践,还能避免后续更多兼容性问题:
public class SomeRepository { private readonly IConverter _converter; // 把依赖通过构造函数传入 public SomeRepository(IConverter converter) { _converter = converter ?? throw new ArgumentNullException(nameof(converter)); } }
这样一来,对象创建时依赖就被初始化了,还能确保依赖不会被随意修改,代码的可靠性更高。
3. 特殊情况处理
如果你的属性是用C# 9+的init关键字定义的(比如public IConverter converter { get; init; }),那Unity的属性注入也会失败——因为init只能在对象初始化阶段赋值,而Unity是在对象创建后才做属性注入的,这种情况同样要换成构造函数注入。
最后说句题外话:Unity新版本的这个改动其实是好事,逼着咱们更规范地使用依赖注入,构造函数注入确实比属性注入更靠谱,能让依赖关系更清晰,也不容易出现空引用的坑。
内容的提问来源于stack exchange,提问作者Dmytro
相关产品推荐
相关产品推荐

