You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 05:37:45