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

WinUI 3 MVVM模式下如何实现服务间的依赖注入?

回答

核心结论

MVVM模式下完全支持将一个服务注入到另一个服务中,这是依赖注入(DI)的常规用法,既能帮你简化UI绑定逻辑,也符合依赖倒置原则。

具体实现步骤

结合你的场景(让每个Job实例持有ITableDefinitionsService引用),可以按以下步骤操作:

1. 修改JobService,注入ITableDefinitionsService

在JobService的构造函数中添加ITableDefinitionsService参数,让DI容器自动注入该服务。后续创建Job实例时,将这个服务引用传递给每个Job:

public class JobService : IJobService
{
    private readonly ITableDefinitionsService _tableDefinitionsService;

    // 通过构造函数注入元数据服务
    public JobService(ITableDefinitionsService tableDefinitionsService)
    {
        _tableDefinitionsService = tableDefinitionsService;
    }

    // 获取Job列表时,将服务引用传递给每个Job实例
    public List<Job> GetJobs()
    {
        // 替换为你实际获取Job数据的逻辑(比如从API/数据库读取)
        var rawJobData = GetRawJobData();
        
        // 为每个Job实例注入元数据服务
        return rawJobData.Select(data => new Job(_tableDefinitionsService)
        {
            Id = data.Id,
            Title = data.Title,
            // 初始化其他Job属性
        }).ToList();
    }

    // 模拟原始Job数据获取逻辑
    private IEnumerable<RawJob> GetRawJobData()
    {
        yield return new RawJob { Id = 1, Title = "开发新功能" };
        yield return new RawJob { Id = 2, Title = "修复线上Bug" };
    }
}

// 模拟原始Job数据结构
public class RawJob
{
    public int Id { get; set; }
    public string Title { get; set; }
}

2. 修改Job类,接收并持有ITableDefinitionsService引用

在Job类的构造函数中接收ITableDefinitionsService,并封装UI需要绑定的元数据内容:

public class Job
{
    private readonly ITableDefinitionsService _tableDefinitionsService;

    public Job(ITableDefinitionsService tableDefinitionsService)
    {
        _tableDefinitionsService = tableDefinitionsService;
    }

    // Job的核心业务属性
    public int Id { get; set; }
    public string Title { get; set; }

    // 暴露UI需要的元数据(如选择列表),直接通过服务获取
    public IEnumerable<string> StatusOptions => _tableDefinitionsService.GetStatusOptions();
    public IEnumerable<string> PriorityOptions => _tableDefinitionsService.GetPriorityOptions();
}

3. 保持原有服务注册逻辑不变

你在App.xaml.cs中的服务注册代码无需修改,DI容器会自动解析JobService对ITableDefinitionsService的依赖:

services.AddSingleton<IJobService, JobService>();
services.AddSingleton<ITableDefinitionsService, TableDefinitionsService>();

注意事项

  • 由于ITableDefinitionsService是Singleton,所有Job实例会共享同一个服务实例,不会产生额外资源开销,符合Singleton的设计意图。
  • Job类依赖抽象接口而非具体实现,后续如果需要替换元数据服务的实现,只需修改DI注册逻辑即可,无需改动Job或JobService代码,符合开闭原则。

内容的提问来源于stack exchange,提问作者Kelderic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:53:23