当前位置: 首页 > news >正文

Services 服务体系

7. Services 服务体系

位置:Source/Services

服务层负责“能力”,不直接关心 UI 细节。

服务项目功能
H.Services.AppPath应用路径,如程序目录、配置目录、数据目录。
H.Services.Common公共服务接口,如数据库连接、主题加载、启动页、引导等。
H.Services.Identity用户、角色、权限、登录、注册。
H.Services.Logger日志服务接口和日志命令。
H.Services.Mail邮件发送。
H.Services.Message消息、对话框、通知、Snack。
H.Services.Operation操作日志。
H.Services.Project项目文件、新建、打开、保存。
H.Services.Revertible撤销、重做。
H.Services.SerializableJSON、XML、克隆、Web 序列化。
H.Services.Setting设置项、设置页面、配置存取。

典型思路:

  • 服务接口放在Services
  • UI 展示放在ModulesPresenters
  • 应用在ConfigureServices中注册具体实现。
  • 运行时通过Ioc.GetService<T>()获取。

Services 服务体系详解

一、服务层概述

服务层是 WPF-Control 框架的能力中心,负责封装各种业务功能和基础设施能力。

核心原则:服务负责能力,不直接关心 UI 细节。

二、服务体系架构

2.1 服务分类

┌─────────────────────────────────────────────────────────────┐ │ Services │ ├─────────────────────────────────────────────────────────────┤ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ AppPath │ │ Identity │ │ Logger │ │ │ │ 应用路径 │ │ 用户权限 │ │ 日志服务 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Mail │ │ Message │ │ Operation │ │ │ │ 邮件发送 │ │ 消息通知 │ │ 操作日志 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Project │ │ Revertible │ │ Serialize │ │ │ │ 项目管理 │ │ 撤销重做 │ │ 序列化 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ Setting │ │ Common │ │ │ │ 设置管理 │ │ 公共服务 │ │ │ └──────────────┘ └──────────────┘ │ └─────────────────────────────────────────────────────────────┘

2.2 服务职责表

服务项目核心功能关键接口
H.Services.AppPath应用路径管理IAppPathServce
H.Services.Common公共服务接口ISplashScreenViewPresenter,IThemeViewPresenter
H.Services.Identity用户认证授权ILoginService,IAuthority,IUser
H.Services.Logger日志记录ILogService,LogCommand
H.Services.Mail邮件发送IMailService
H.Services.Message消息通知IMessageService,ISnackMessageService
H.Services.Operation操作日志IOperationLogService
H.Services.Project项目管理IProjectService
H.Services.Revertible撤销重做IRevertibleService
H.Services.Serializable序列化ISerializeService
H.Services.Setting设置管理ISettingService,ISettingViewPresenter

三、核心服务详解

3.1 AppPath - 应用路径服务

功能介绍

IAppPathServce提供应用运行时所需的各种路径:

属性说明示例路径
AppPath程序安装目录C:\Program Files\MyApp
AppName应用名称MyApp
Version应用版本1.0.0.0
Config配置目录C:\ProgramData\MyApp\Config
Data数据目录C:\ProgramData\MyApp\Data
Log日志目录C:\ProgramData\MyApp\Log
Setting设置目录C:\ProgramData\MyApp\Setting
UserPath用户目录C:\Users\Admin\AppData\Roaming\MyApp
UserData用户数据目录C:\Users\Admin\AppData\Roaming\MyApp\Data
UserSetting用户设置目录C:\Users\Admin\AppData\Roaming\MyApp\Setting
使用示例
// 获取路径服务IAppPathServcepathService=Ioc.GetService<IAppPathServce>();// 获取各种路径stringlogPath=pathService.Log;// 日志目录stringdataPath=pathService.Data;// 数据目录stringsettingPath=pathService.Setting;// 设置目录// 静态方式访问(推荐)stringuserData=AppPaths.Instance.UserData;

3.2 Logger - 日志服务

接口定义
publicinterfaceILogService{voidInfo(stringmessage);voidError(stringmessage);voidError(Exceptionex);voidWarn(stringmessage);voidDebug(stringmessage);voidTrace(stringmessage);}
使用示例
// 方式一:通过 IOC 获取ILogServicelogger=Ioc.GetService<ILogService>();logger.Info("应用启动");logger.Error("发生错误",ex);// 方式二:使用静态类(推荐)IocLog.Instance.Info("用户登录成功");IocLog.Instance.Error(ex);

3.3 Message - 消息服务

消息类型
类型用途示例
Dialog模态对话框确认删除、提示信息
Snack底部通知条操作成功提示
Notice通知消息系统通知
使用示例
// 显示对话框awaitIoc.GetService<IMessageService>().ShowMessageAsync("操作成功","提示");// 显示确认对话框boolresult=awaitIoc.GetService<IMessageService>().ShowConfirmAsync("确定要删除吗?","确认删除");// 显示 Snack 消息Ioc.GetService<ISnackMessageService>().Show("保存成功");

3.4 Identity - 身份认证服务

核心接口
// 用户接口publicinterfaceIUser{stringId{get;}stringName{get;}stringAccount{get;}}// 登录服务publicinterfaceILoginService{Task<bool>Login(stringaccount,stringpassword);voidLogout();boolIsLogined{get;}IUserCurrentUser{get;}}// 权限服务publicinterfaceIAuthority{boolHasPermission(stringpermission);boolHasRole(stringrole);}
使用示例
// 登录ILoginServiceloginService=Ioc.GetService<ILoginService>();boolsuccess=awaitloginService.Login("admin","password");if(success){IocLog.Instance.Info($"用户{loginService.CurrentUser.Name}登录成功");}// 权限检查IAuthorityauthority=Ioc.GetService<IAuthority>();if(authority.HasPermission("Delete")){// 执行删除操作}

3.5 Setting - 设置服务

功能介绍

设置服务负责管理应用的配置项:

publicinterfaceISettingService{TGetSetting<T>(stringkey);voidSetSetting<T>(stringkey,Tvalue);voidSave();voidLoad();}
使用示例
ISettingServicesettingService=Ioc.GetService<ISettingService>();// 读取设置stringtheme=settingService.GetSetting<string>("Theme");intfontSize=settingService.GetSetting<int>("FontSize");// 保存设置settingService.SetSetting("Theme","Dark");settingService.SetSetting("FontSize",14);settingService.Save();

3.6 Serializable - 序列化服务

功能介绍

提供多种序列化方式:

方法说明
ToJson()对象转 JSON
FromJson()JSON 转对象
ToXml()对象转 XML
FromXml()XML 转对象
Clone()对象深拷贝
使用示例
ISerializeServiceserializeService=Ioc.GetService<ISerializeService>();// 对象转 JSONMyDatadata=newMyData{Name="Test",Value=100};stringjson=serializeService.ToJson(data);// JSON 转对象MyDatarestored=serializeService.FromJson<MyData>(json);// 对象克隆MyDatacloned=serializeService.Clone(data);

四、服务使用流程

4.1 服务注册

ConfigureServices中注册服务:

publicpartialclassApp:ApplicationBase{protectedoverridevoidConfigureServices(IServiceCollectionservices){// 注册路径服务services.AddAppPath();// 注册日志服务(使用 log4net)services.AddLog4net();// 注册消息服务services.AddAdornerDialogMessage();services.AddSnackMessage();// 注册身份认证服务services.AddIdentity();// 注册设置服务services.AddSetting();// 注册序列化服务services.AddSerialize();}}

4.2 服务获取

运行时通过 IOC 容器获取服务:

// 方式一:直接获取(常用)varlogger=Ioc.GetService<ILogService>();// 方式二:安全获取(不抛异常)varoptionalService=Ioc.GetService<IMyOptionalService>(throwIfNone:false);if(optionalService!=null){optionalService.DoSomething();}// 方式三:静态类访问(推荐用于常用服务)IocLog.Instance.Info("日志消息");

4.3 服务注入

在构造函数中注入服务:

publicclassMyPresenter{privatereadonlyILogService_logService;privatereadonlyIMessageService_messageService;// 通过构造函数注入publicMyPresenter(ILogServicelogService,IMessageServicemessageService){_logService=logService;_messageService=messageService;}publicvoidDoSomething(){_logService.Info("执行操作");_messageService.ShowMessage("操作完成");}}

五、服务设计原则

5.1 接口优先

// ✅ 推荐:依赖接口publicclassMyService:IMyService{}// ❌ 不推荐:直接依赖具体类publicclassMyService{}

5.2 单一职责

// ✅ 推荐:一个服务只做一件事publicinterfaceILogService{}// 日志服务publicinterfaceIMessageService{}// 消息服务// ❌ 不推荐:胖接口publicinterfaceIAllInOneService{voidLog();voidSendMessage();voidSaveSetting();}

5.3 无状态设计

// ✅ 推荐:无状态服务publicclassLogService:ILogService{publicvoidInfo(stringmessage){// 直接写入日志,不保存状态File.AppendAllText("log.txt",message);}}

六、服务扩展模式

6.1 创建自定义服务

步骤1:定义接口

publicinterfaceIMyService{voidDoWork(stringparam);Task<string>GetDataAsync();}

步骤2:实现服务

publicclassMyService:IMyService{publicvoidDoWork(stringparam){// 实现逻辑}publicasyncTask<string>GetDataAsync(){// 异步操作returnawaitTask.FromResult("data");}}

步骤3:创建扩展方法

publicstaticclassMyServiceExtension{publicstaticIServiceCollectionAddMyService(thisIServiceCollectionservices){services.TryAddSingleton<IMyService,MyService>();returnservices;}}

步骤4:注册服务

protectedoverridevoidConfigureServices(IServiceCollectionservices){services.AddMyService();}

6.2 服务配置选项

// 定义配置类publicclassMyServiceOptions{publicstringApiUrl{get;set;}="http://localhost:5000";publicintTimeout{get;set;}=30;}// 扩展方法publicstaticIServiceCollectionAddMyService(thisIServiceCollectionservices,Action<MyServiceOptions>setupAction=null){services.AddOptions();if(setupAction!=null)services.Configure(setupAction);services.TryAddSingleton<IMyService,MyService>();returnservices;}// 使用services.AddMyService(options=>{options.ApiUrl="http://api.example.com";options.Timeout=60;});

七、服务层与其他层的关系

┌─────────────────────────────────────────────────────────────┐ │ UI Layer │ │ Controls / Presenters / Views │ ├─────────────────────────────────────────────────────────────┤ │ Modules │ │ 功能模块组合 │ ├─────────────────────────────────────────────────────────────┤ │ Services │ │ 能力提供层 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ Logger │ │ Message │ │ Setting │ │ AppPath │ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ IOC │ │ 服务连接与管理 │ └─────────────────────────────────────────────────────────────┘

调用关系

View/Presenter │ ├─→ Ioc.GetService<IMessageService>() │ │ │ ▼ │ MessageService.Show() │ ├─→ Ioc.GetService<ILogService>() │ │ │ ▼ │ LogService.Info() │ └─→ Ioc.GetService<ISettingService>() │ ▼ SettingService.GetSetting()

八、总结

服务层是 WPF-Control 框架的能力核心,具有以下特点:

  1. 职责清晰:每个服务只负责一类能力
  2. 松耦合:通过接口定义,便于替换实现
  3. 可测试:依赖注入使单元测试更简单
  4. 可扩展:通过扩展方法轻松添加新服务

掌握服务体系的使用,是开发高质量 WPF 应用的关键。

http://www.jsqmd.com/news/863162/

相关文章:

  • 试制类项目审价深度解析[18号文]
  • 智慧医疗药品胶囊缺陷检测数据集VOC+YOLO格式219张5类别有增强
  • 3个维度重塑开发体验:GitHub中文化插件的效率革命
  • 免费解锁显卡隐藏性能:NVIDIA Profile Inspector终极优化指南
  • HTTP安全头配置陷阱与三层验证修复指南
  • Unity中获取物体尺寸的三种核心方法与适用场景
  • 【信息科学与工程学】信息科学领域工程——第十一篇 数据库基础040 关系代数操作
  • 动态字体反爬破解:服务端代劳模式实战
  • ViGEmBus虚拟游戏控制器驱动:Windows游戏输入的终极解决方案
  • Office Custom UI Editor完全指南:免费打造你的专属Office工作界面
  • 微信抢红包终极指南:Android自动抢红包工具完整教程
  • 关联规则分析(Apriori算法)
  • Unity中XPBD物理引擎实战:解决PBD卡顿与不稳定性
  • Nginx 配置 HSTS 头强制客户端使用 HTTPS 的具体指令是什么
  • G-Helper:华硕笔记本轻量化硬件控制框架技术解析
  • 螺丝螺栓垫圈缺陷检测生锈划痕数据集VOC+YOLO格式1291张6类别有增强
  • GitHub中文化插件:5分钟让GitHub界面全面汉化的技术实现
  • QMCDecode终极指南:5分钟快速掌握QQ音乐加密格式转换技巧
  • C#零拷贝内存扫描:游戏调试的高性能替代方案
  • 炉石佣兵战记自动化脚本:5分钟告别重复操作,释放你的游戏时间
  • 算力狂飙遇瓶颈,电源破局正当时!
  • FreeMove终极指南:如何安全迁移Windows文件夹而不破坏系统
  • Deep:DeepSeek 版的 Aider / Claude Code,开源 CLI 编程工具新选择
  • Unity中让Dictionary在Inspector可编辑的实用方案
  • 重磅盘点!国内空气能十大品牌权威实力|口碑好、评价高的空气能品牌精选 - 匠言榜单
  • 5月22-24日|鑫云科技诚邀您相约第64届高等教育博览会
  • 海外网红营销AI skills到底是什么?2026年出海品牌选型指南
  • AI实时翻译实现BurpSuite中文界面(无需修改源码)
  • 如何完成 FISCO BCOS 的第一个 PR —— 实战教程
  • CI/CD管道安全:保障持续集成和部署的安全性