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
相关产品推荐
相关产品推荐

