ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

LoxodonFramework服务容器与上下文详解:ApplicationContext、PlayerContext与依赖注入完全指南

LoxodonFramework服务容器与上下文详解:ApplicationContext、PlayerContext与依赖注入完全指南 LoxodonFramework服务容器与上下文详解ApplicationContext、PlayerContext与依赖注入完全指南【免费下载链接】loxodon-frameworkLoxodonFramework是一个轻量级的MVVM(Model-View-ViewModel)框架它是专门为Unity3D游戏开发设计的参考了WPF和Android的MVVM设计它提供了视图和视图模型的数据绑定、本地化、一个简单的对象容器、配置文件组件、线程工具组件、应用上下文和玩家上下文异步线程和协程的任务组件等基本组件同时还提供了一个UI视图的框架。所有代码都基于面向对象面向接口的思路设计几乎所有功能都可以自定义。而且在数据绑定部分进行了性能优化避免值类型装箱拆箱最小化垃圾回收的开销使用动态委托/静态织入技术确保数据绑定和直接调用有相当的性能0GC更新UI视图等等它支持绑定到UGUI、UIToolkit和FairyGUI控件同时也很容易扩展对其他UI控件的支持。此外它已经在项目中得到验证UWA评分SSS级可在战斗中完全关闭GC在6、7前手机都保证60FPS性能优越稳定可靠架构清晰可灵活扩展。 我们希望它能够帮助您更快、更轻松地开发游戏。 本框架使用C#语言开发同时也支持使用XLua或者ILRuntime来开发如果项目需要热更新那么只要安装了XLua或者ILRuntime插件则可以完全使用Lua或者ILRuntime来开发游戏。对于新立项的项目建议使用HybridCLR来做热更新。 这个插件兼容 MacOSX,Windows,Linux,UWP,IOS and Android,WebGL等等并且完全开源。项目地址: https://gitcode.com/vovgou/loxodon-frameworkLoxodonFramework 是专为 Unity3D 游戏开发设计的轻量级 MVVM 框架它内置了服务容器ServiceContainer与两级上下文机制——应用上下文ApplicationContext和玩家上下文PlayerContext通过简单的注册/解析实现依赖注入帮你统一管理全局服务与玩家私有数据避免单例满天飞。本文用最少代码带你彻底搞懂这套机制。为什么游戏需要服务容器 上下文传统写法里全局服务常常靠静态单例硬编码导致模块之间强耦合测试困难玩家切换账号时数据残留、内存泄漏全局服务与玩家私有服务混在一起无法按生命周期释放。LoxodonFramework 的解法是服务注册进容器容器挂在上下文上上下文按全局 / 玩家分层。核心源码都在Contexts与Services目录核心类职责源码位置Context上下文基类管理属性字典 服务容器支持级联查找Context.csApplicationContext全局唯一的应用上下文存放全局共享服务ApplicationContext.csPlayerContext按玩家创建的上下文存放玩家私有数据与服务PlayerContext.csServiceContainer依赖注入容器按类型或名称注册/解析服务ServiceContainer.cs应用上下文ApplicationContext全局服务的单一入口应用上下文是全局单例在引擎场景加载前自动创建Context内置了BeforeSceneLoad初始化你无需手动 new。所有在整个游戏中共享的基础服务——数据绑定服务、视图定位、本地化、资源加载、日志等——都应注册到它身上。// 获得全局的应用上下文 ApplicationContext context Context.GetApplicationContext(); // 获得上下文中的服务容器 IServiceContainer container context.GetContainer(); // 初始化并启动数据绑定服务一组服务统一通过 ServiceBundle 注册 BindingServiceBundle bindingService new BindingServiceBundle(container); bindingService.Start(); // 从全局上下文解析服务 IUIViewLocator locator context.GetServiceIUIViewLocator(); Localization localization context.GetServiceLocalization();ApplicationContext还额外提供了几个便捷能力见 ApplicationContext.csGetMainLoopExcutor()获取主线程执行器方便在任意位置投递主线程任务GetGlobalPreferences()/GetUserPreferences(name)获取全局/用户偏好设置天然配合玩家隔离。官方教程里的标准用法可以参考 DatabindingExample.cs。依赖注入怎么做ServiceContainer 的注册与解析ServiceContainer内部使用线程安全的并发字典同时维护类型 → 服务和名称 → 服务两套映射支持四种常见注册方式// 1. 按类型注册单例所有解析都拿到同一个实例 container.RegisterIKnapsackService(new KnapsackService()); // 2. 按名称注册单例 container.Register(http, new HttpClient()); // 3. 按类型注册工厂每次解析都创建新实例 container.RegisterILog(() new FileLog()); // 4. 按名称注册工厂 container.Register(cache, () new MemoryCache()); // 解析 IKnapsackService knapsack context.GetServiceIKnapsackService(); object log container.Resolve(typeof(ILog)); // 注销 container.UnregisterIKnapsackService(); 几个必须知道的细节重复注册同名/同类型会抛异常DuplicateRegisterServiceException帮你提前发现配置错误非泛型类型按类型注册后还可以用类型名字符串解析字符串与类型双通道查找按名称注册的服务只能用名称解析解析不到时返回null/default不会抛异常调用方需自行判空。玩家上下文PlayerContext玩家数据隔离的最佳实践玩家上下文只与当前登录的玩家相关。玩家 Clark 的背包、角色信息、个人配置都该放在他的玩家上下文里切换账号时调用一次Dispose()该玩家注册的所有服务会被自动注销、相关IDisposable服务会被释放天然避免账号数据串味和内存泄漏。// 为玩家 clark 创建一个玩家上下文 PlayerContext playerContext new PlayerContext(clark); // 玩家上下文默认继承全局上下文contextBase ApplicationContext playerContext.Set(roleInfo, roleInfo); // 玩家私有服务注册到玩家上下文的服务容器 playerContext.GetContainer().RegisterIKnapsackService(new KnapsackService()); // 玩家私有服务优先全局服务自动穿透获取 IUIViewLocator locator playerContext.GetServiceIUIViewLocator(); // 玩家退出登录时释放整个玩家上下文 playerContext.Dispose();级联查找玩家上下文如何看到全局服务Context的查找逻辑是先查自己再查父上下文见 Context.csGetServiceT()先在玩家容器的Resolve中找找不到再递归到应用上下文玩家上下文注册了与全局同 Key的服务时数据只存在玩家上下文不会覆盖全局数据访问时玩家级优先。这意味着你可以在战斗代码里只依赖PlayerContext它既是依赖注入的聚合入口又不会把全局服务重复注册一遍。生命周期管理登录 → 游玩 → 退出推荐把上下文生命周期与账号流程绑定游戏启动ApplicationContext自动创建注册全局基础服务绑定、本地化、日志、窗口管理等玩家登录new PlayerContext(username)注册背包、邮件等玩家私有服务游玩过程业务代码统一通过上下文GetServiceT()取服务不直接new全局依赖退出/切换账号playerContext.Dispose()玩家级服务全部释放全局服务保持不变。常见坑与注意事项服务必须实现IDisposable才能被自动释放。Context.Dispose()只释放内部容器和已注册的可释放服务普通对象需自行清理不要重复注册相同类型/名称会直接抛异常中断启动流程适合暴露配置错误编辑器反复按播放时Context会在BeforeSceneLoad自动清理旧上下文无需手动处理自己扩展上下文如副本上下文时Context构造函数传null容器即可内部会自动创建ServiceContainer属性存取用Set/Get(name)支持cascade参数决定是否向上查找注意泛型转换不匹配会抛InvalidCastException。更多扩展玩法比如为 MMO 副本创建专属上下文可阅读官方文档docs/LoxodonFramework.md 中的上下文Context章节。相关资源上下文实现Context.cs应用上下文ApplicationContext.cs玩家上下文PlayerContext.cs服务容器实现ServiceContainer.cs服务接口定义IServiceContainer.cs【免费下载链接】loxodon-frameworkLoxodonFramework是一个轻量级的MVVM(Model-View-ViewModel)框架它是专门为Unity3D游戏开发设计的参考了WPF和Android的MVVM设计它提供了视图和视图模型的数据绑定、本地化、一个简单的对象容器、配置文件组件、线程工具组件、应用上下文和玩家上下文异步线程和协程的任务组件等基本组件同时还提供了一个UI视图的框架。所有代码都基于面向对象面向接口的思路设计几乎所有功能都可以自定义。而且在数据绑定部分进行了性能优化避免值类型装箱拆箱最小化垃圾回收的开销使用动态委托/静态织入技术确保数据绑定和直接调用有相当的性能0GC更新UI视图等等它支持绑定到UGUI、UIToolkit和FairyGUI控件同时也很容易扩展对其他UI控件的支持。此外它已经在项目中得到验证UWA评分SSS级可在战斗中完全关闭GC在6、7前手机都保证60FPS性能优越稳定可靠架构清晰可灵活扩展。 我们希望它能够帮助您更快、更轻松地开发游戏。 本框架使用C#语言开发同时也支持使用XLua或者ILRuntime来开发如果项目需要热更新那么只要安装了XLua或者ILRuntime插件则可以完全使用Lua或者ILRuntime来开发游戏。对于新立项的项目建议使用HybridCLR来做热更新。 这个插件兼容 MacOSX,Windows,Linux,UWP,IOS and Android,WebGL等等并且完全开源。项目地址: https://gitcode.com/vovgou/loxodon-framework创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表