# Baboon **Repository Path**: walterwhiteHi/baboon ## Basic Information - **Project Name**: Baboon - **Description**: 这是一个轻量级wpf插件化开发的基础库。它内置了模块化加载、模块化日志记录、模块化本地存储、模块化IOC注册、以及开发Mvvm必要的Command和EventTrigger。 - **Primary Language**: C# - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 13 - **Created**: 2025-02-13 - **Last Updated**: 2025-02-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Baboon #### 介绍 这是一个轻量级wpf插件化开发的基础库。它内置了模块化加载、模块化日志记录、模块化本地存储、模块化IOC注册、以及开发Mvvm必要的Command和EventTrigger。 #### 安装教程 nuget安装`Baboon`即可。 ``` Install-Package Baboon ``` #### 使用 安装完成以后,需要在App.xaml和.cs中,修改基类继承。 ``` ``` 同时需要在App.xaml.cs中,实现抽象类成员。包括注册容器和创建主窗口。 ``` public partial class App : BaboonApplication { protected override Window CreateShell() { //创建主窗口 return this.Container.Resolve(); } protected override void RegisterTypes(IContainer container) { //注册容器 container.RegisterSingletonView(); } } ``` #### 新建模块 新建一个项目,命名为SayHello.Module,添加对`Baboon`的引用。 然后新建一个类,命名为SayHelloModule,继承自`AppModuleBase`或实现`IAppModule`接口。 然后实现基本成员。 ``` public class SayHelloModule : AppModuleBase { public SayHelloModule(ILoggerFactoryService loggerFactory) : base(loggerFactory) { } public override ModuleDescription Description { get; } public override ImageSource Icon => throw new NotImplementedException(); public override void Show(object parameter = null) { MessageBox.Show("Hello"); } } ``` ModuleDescription是模块描述,可以直接赋值,也可以通过xml文件定义。 ```xml SayHello SayHello 1.0.0 RRQM 会弹出Hello false SayHello.Module.dll ``` #### 注册模块 在App中,重写ConfigureModuleCatalog。可以注册模块。 注册的方式有三种,实例注册、类型注册、构建器注册。 实例注册和类型注册,时直接将模块注册到主程序。这会立刻加载模块,并且需要主程序引用模块。 构建器注册则是只注册模块信息,等需要模块的时候,自动加载模块。并且不需要主程序引用模块。 ``` public partial class App : BaboonApplication { ... protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) { //以实例注册 moduleCatalog.Add(new SayHelloModule(this.Container.Resolve())); //以类型注册 moduleCatalog.Add(typeof(SayHelloModule)); //以构建器注册 moduleCatalog.Add(new ModuleDescriptionBuilder() { Description = new ModuleDescription(), Module = "", RootDir = "" }); } } ``` #### 加载、使用模块 模块的加载是自动的,即使使用构建器注册的。也会在需要时时机加载模块。 使用模块,需要从容器中获得IModuleCatalog。 然后可以Contains(id)的方法,判断是否已注册对应Id的模块。 通过TryGetAppModuleInfo可以获取到模块信息。 appModuleInfo.Loaded属性可以判断当前模块是否已经加载到主程序中。 appModuleInfo.GetApp()即可获取到指定的模块。 ``` internal class MainViewModel : ViewModelBase { private readonly IModuleCatalog m_moduleCatalog; public MainViewModel(IModuleCatalog moduleCatalog) { this.m_moduleCatalog = moduleCatalog; } private void RunSayHello() { if (!this.m_moduleCatalog.Contains("SayHello")) { MessageBox.Show("没有找到模块"); } if (this.m_moduleCatalog.TryGetAppModuleInfo("SayHello", out var appModuleInfo)) { if (!appModuleInfo.Loaded)//没有加载到主程序 { if (MessageBox.Show("模块没有加载,是否加载?", "", MessageBoxButton.YesNo) == MessageBoxResult.Yes) { var app = appModuleInfo.GetApp(); app.Show(); } } else { var app = appModuleInfo.GetApp(); app.Show(); } } } } ``` #### 模块管理器 使用IModuleManagerService服务,可以实现对模块的快速管理。包括安装、更新、卸载等。 同时IModuleCatalog也会对存放在Modules文件夹下的所有模块进行注册。但前提是每个模块必须包含一个名为Description.xml的文件。 #### 模块日志 每个模块可以拥有单独的日志记录器。通过IAppModule.Logger即可获得。 #### 模块本地数据库 Baboon集成了LiteDB数据库,并封装了KV键值存储。使用IConfigurationStoreService即可。 #### Mvvm Baboon简单的封装了基本的Mvvm框架,基本能满足使用。 【Cammand】 ExecuteCommand类。 【ViewModel】 ObservableObject和ViewModelBase类。 【容器注册View并绑定】 ``` public partial class App : BaboonApplication { ... protected override void RegisterTypes(IContainer container) { container.RegisterSingletonView(); } } ``` 【绑定事件触发器】 使用EventAction实现。 #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request