从Catel 5.12升级至6.0.3遇到的编译错误及文档缺失问题
Catel 5.x 升级到 6.0.3 Core 编译错误解决方案
1. AutoRegisterTypesViaAttributes 属性不存在
Catel 6.x 重构了服务注册逻辑,移除了原ServiceLocatorConfiguration中的AutoRegisterTypesViaAttributes属性。替代方案:
- 手动通过
TypeFactory注册类型:使用TypeFactory.Default.RegisterType<IType, ConcreteType>()逐个注册 - 若需批量扫描注册,可借助
TypeScanner扫描程序集,再批量注册带有自定义标记的类型(原属性自动注册逻辑需自行实现)
2. ServiceLocatorRegistration 并非属性类
Catel 6.x 彻底移除了ServiceLocatorRegistrationAttribute,不再支持通过属性标记自动注册类型。现在需直接通过服务定位器的API注册:
ServiceLocator.Default.RegisterType<IService, ServiceImplementation>();
如果使用依赖注入容器集成(如.NET Core DI),可通过容器的注册API替代。
3. ViewModelBase 缺失带旧值/新值的RaisePropertyChanged重载
Catel 6.x 简化了ViewModelBase的RaisePropertyChanged方法,移除了带旧值、新值的重载。替代方案:
- 使用
SetProperty方法自动处理属性变更,该方法内部会自动跟踪旧值并触发变更通知:private string _name; public string Name { get => _name; set => SetProperty(ref _name, value); } - 若需手动处理旧值和新值,可在属性setter中先保存旧值,调用
RaisePropertyChanged后自行处理:private string _name; public string Name { get => _name; set { var oldValue = _name; _name = value; RaisePropertyChanged(nameof(Name)); // 此处可使用 oldValue 和 value 做自定义逻辑 } } - 也可订阅
ViewModelBase的AdvancedPropertyChanged事件,该事件的参数会包含旧值和新值。
关于变更文档
Catel 6.x 属于重大版本重构,部分旧文档未及时同步更新。可参考官方GitHub仓库的release notes和迁移相关issue获取更准确的变更细节。
内容的提问来源于stack exchange,提问作者John Baur
相关产品推荐
相关产品推荐

