Prism.Unity转DryIoC:.NET MAUI迁移中ParameterOverride替代方案问询
在DryIoC中实现Unity ParameterOverrides的等效功能
针对你从Unity迁移到DryIoC的场景,需要实现解析时动态覆盖构造函数部分参数(其余依赖从容器自动解析)的需求,DryIoC可以通过命名参数覆盖的方式实现和Unity ParameterOverrides完全等效的功能,以下是具体实现方案:
核心实现:通用参数覆盖解析方法
可以封装一个和原Unity解析逻辑对齐的通用方法,接收参数名与对应值的集合,在解析时动态替换指定参数:
// 自定义解析方法,对应原Unity的ResolverOverride逻辑 public T ResolveWithOverrides<T>(IEnumerable<(string ParamName, object Value)> parameterOverrides) { // 构造DryIoC的参数覆盖规则:优先使用传入的命名参数,其余从容器解析 var made = Made.Of( FactoryMethod.ConstructorWithResolvableArguments, _ => parameterOverrides.ToDictionary(p => p.ParamName, p => p.Value) ); return _container.Resolve<T>(made: made); }
调用示例(对应原Unity代码)
和你原来的调用方式几乎一致,只需将ParameterOverride转换为参数名+值的元组集合:
// 构造动态参数集合(对应原ParameterOverride数组) var overrides = new[] { ("productID", (object)8675309), ("objectWithData", IObjectWithData) }; // 调用自定义解析方法获取实例 var targetView = ResolveWithOverrides<YourTargetView>(overrides);
关键细节说明
- 参数匹配规则:DryIoC会根据传入的
ParamName精准匹配构造函数的参数名称,默认区分大小写,若需要忽略大小写,可在容器初始化时配置:var container = new Container(rules => rules.WithIgnoreCaseForName()); - 依赖优先级:
ConstructorWithResolvableArguments规则会优先使用你传入的动态参数,未被覆盖的构造函数参数依然从容器中自动解析已注册的依赖,和Unity的行为完全一致。 - 支持的参数类型:无论是值类型、接口实例还是普通对象,都可以直接传入作为覆盖值,无需额外注册。
简化写法(参数较少时)
如果不需要通用方法,参数数量不多的情况下,可以直接在Resolve调用中指定命名参数:
var targetView = _container.Resolve<YourTargetView>( made: Made.Of(() => new YourTargetView( Arg.Named("productID", 8675309), Arg.Named("objectWithData", IObjectWithData) // 其余已注册的依赖无需显式指定,DryIoC会自动解析 )) );
内容的提问来源于stack exchange,提问作者mnx
相关产品推荐
相关产品推荐

