如何为MVVM Toolkit生成的ObservableObject定义接口?
为MVVM Toolkit生成的ObservableObject类定义接口的方案
我们团队采用MVVM架构,测试框架与依赖注入要求每个类都要有对应接口,用于应用构建器注册及单元测试的NSubstitute模拟,示例构造函数如下:
public DisclaimerViewModel( ILogger<DisclaimerViewModel> logger, IResourceExtractor resourceExtractor, IUserSettings userSettings, IAppInfo appInfo, INavigationService navigationService)
现在需要为带有[ObservableProperty]特性私有字段的MVVM Toolkit生成的ObservableObject类定义接口,具体操作步骤和示例如下:
核心思路
MVVM Toolkit的[ObservableProperty]特性会自动生成公共属性(带get/set),同时因为继承了ObservableObject,类本身实现了INotifyPropertyChanged接口。所以我们定义的接口需要:
- 继承
INotifyPropertyChanged,保证属性变更通知的契约 - 声明所有由
[ObservableProperty]生成的公共属性 - 无需包含构造函数(接口不负责实例化逻辑)
示例实现
1. 定义对应接口
针对MyTestClass,我们需要创建包含自动生成的Count属性,并继承INotifyPropertyChanged的接口:
using System.ComponentModel; public interface IMyTestClass : INotifyPropertyChanged { int Count { get; set; } }
2. 修改ViewModel类实现接口
让原MyTestClass实现上述接口,因为MVVM Toolkit已经自动生成了Count属性的实现,所以无需手动编写属性逻辑:
using CommunityToolkit.Mvvm.ComponentModel; [ObservableObject] public partial class MyTestClass : IMyTestClass { [ObservableProperty] private int _count; public MyTestClass(int count) { _count = count; } }
3. DI注册与单元测试示例
依赖注入注册
// 应用构建器中注册 services.AddTransient<IMyTestClass, MyTestClass>();
NSubstitute模拟测试
// 创建模拟对象 var mockTestClass = Substitute.For<IMyTestClass>(); // 设置属性值 mockTestClass.Count = 5; // 验证属性访问 Assert.AreEqual(5, mockTestClass.Count);
内容的提问来源于stack exchange,提问作者Mark Wardell
相关产品推荐
相关产品推荐

