• TaskHosting


    由来

    对于喜欢开发的我经常会写一些小工具,这些小工具多以功能为主,不要求漂亮、个性化的UI。但起码要保证使用方便,因此最基本的功能要有:

    • GUI(图片用户界面)
    • 程序配置的保存与读取(让用户在GUI上操作要方便)
    • 用户使用习惯的自动记录(例如:上次关闭时窗口位置及大小等)
    • 程序崩溃捕获及上报
    • 实时显示运行日志(当前执行到哪步了,输出结果是什么)
    • 多线程管理及调度框架

    如果每个工具都要COPY一遍以上功能的代码以后维护起来是个大坑,封装成库调用呢?那每个工具都要写一遍组装UI组件的代码。

    仔细想一下,其实我要写的就是一款小工具,它以实现功能为主。

    那么我就需要有一个开发框架,它可以让我只专注于功能(业务)的实现,简化UI相关的编码,最好是能用一行代码就实现一个UI功能,这个开发框架现在写好了我给它取名为TaskHosting 

     

    TaskHosting初识

    先来张截图看看它长什么样~_~

    TaskHosting界面中大部分UI都是可以自定义的,大部分情况下只需要2-3行C#代码就可以定制一部分UI功能,如果你不会WPF也可以用WinForms定制里面的UI(通过WindowsFormsHost)

    当然我们的目标是不关心UI,专注于功能实现,让我们来看下如何使用它。

    首先从Hello Word开始:

    1. 首先要创建一个类库项目,然后引用TaskHosting框架相关类库
    2. 项目属性 > 调试 > 启动操作 > 选择【启动外部程序】,路径填写TaskHosting.exe的路径
    3. 创建一个【任务】类 HelloWordTask.cs,代码如下(现在先不用明白什么意思,后面会有介绍)
       1 [Task("Hello Word", IsMutilThread = true, ConfigType = typeof(Config))]
       2     class HelloWordTask : Mondol.TaskHosting.Task
       3     {
       4         private readonly Config _cfg;
       5         private readonly IImmediateLogger _immediateLogger;
       6 
       7         public HelloWordTask(Config cfg, IImmediateLogger immediateLogger)
       8         {
       9             _cfg = cfg;
      10             _immediateLogger = immediateLogger;
      11         }
      12 
      13         public override void OnRun()
      14         {
      15             _immediateLogger.Info($"设置1的值为: { _cfg.Setting1}");
      16             _immediateLogger.Info($"设置2的值为: { _cfg.Setting2}");
      17         }
      18     }
      19 }
      View Code
    4. 创建一个【任务】的配置类 Config.cs,代码如下:
       1 class Config : Mondol.Configuration, ITaskConfig
       2     {
       3         private readonly IAppEnvironment _appEnv;
       4 
       5         public Config(IAppEnvironment appEnv)
       6         {
       7             this._appEnv = appEnv;
       8         }
       9 
      10         protected override string GetConfigurationFilePath()
      11         {
      12             return Path.Combine(_appEnv.GetPluginDataBasePath(GetType().Assembly), "HelloWord.Config.json");
      13         }
      14 
      15         [Category("基本设置"), DisplayName("设置1"), Description("程序设置1,存储 string 类型的设置")]
      16         public string Setting1
      17         {
      18             get
      19             {
      20                 return GetProperty(nameof(Setting1), "我是设置1的默认值");
      21             }
      22             set
      23             {
      24                 SetProperty(nameof(Setting1), value);
      25             }
      26         }
      27 
      28         [Category("基本设置"), DisplayName("设置2"), Description("程序设置2,存储 int 类型的设置")]
      29         public int Setting2
      30         {
      31             get
      32             {
      33                 return GetProperty(nameof(Setting2), 5);
      34             }
      35             set
      36             {
      37                 SetProperty(nameof(Setting2), value);
      38             }
      39         }
      40     }
      View Code

    运行程序,效果如下:

    怎么样,是不是很简单?

     

    有什么功能

    目前TaskHosting有如下功能:

    • 强大的日志功能
      • 输出到UI中的即时日志也可以存到文件、数据库、甚至远程服务器
      • 程序崩溃自动将异常记录日志
      • 即时日志可按日志级别(跟踪、调试、信息、警告、错误、致命)过滤显示
      • 可用专用的文件日志分析工具
    • 方便的配置存取
      • 每个【任务】都可以有自己的配置文件
      • 配置文件自动读取、自动保存
      • 配置项可限制数据类型、支持拖拽
      • 配置项可加详细描述
    • 自动记录使用习惯
      • 重新打开软件会恢复上次选择的【任务】、窗口大小、位置等
    • 崩溃捕获及上报
      • 自动捕获未处理异常,并显示友好错误处理窗口
      • 未处理异常可自动上报服务器、发邮件或由用户处理
    • 多线程调度框架
      • 经过优化的线程调度框架、最大化利用系统资源
      • 【任务】可决定是否启用多线程
    • 更多特性还在完善中。。。

    以上功能均可灵活的自定义,TaskHosting的目标 - 简洁而不简单

     

    设计概念

    TaskHosting是一个【任务】的管理器(继承自Mondol.TaskHosting.Task的类就是一个任务),每一个【任务】对应一个功能,例如:网址采集任务、数据同步任务等。

    【任务】的类来自于你编写的类库项目(下称插件),每一个插件可以包含多个任务。

    参考上面的HelloWordTask类,它继承了Mondol.TaskHosting.Task所以它是一个任务,将来会显示在【任务:】列表中。

    你可以用Task属性来指定任务的名称、是否支持多线程、配置类类型等

     

    无处不在的依赖注入

    依赖注入是一个很简单的概念,例如:ClassA依赖于ClassB,ClassB又依赖于ClassC,传统的硬编码方式是先分别new出ClassB、ClassC才能new ClassA。

    依赖注入框架会管理这种依赖关系,使用时无需关心谁依赖谁,只需要告诉框架我需要ClassA的实例,它就会自动帮你创建出来。

    详细依赖注入的概述网上有很多介绍文章,大家找一下就好了。

    TaskHosting采用了Autofac来管理模块间的依赖关系,TaskHosting支持3种类型注册的方式:

    • 编码注册
          //相当于程序的Main方法所属类(后面会详细介绍)
          internal class Initializer : IInitializer
          {
              public void ConfigureServices(ContainerBuilder builder)
              {
                  //Autofac的方式注册
                  builder.RegisterType<Config>().AsSelf();
              }
          }
    • 属性注册
          //通过属性注入,可指定是否单例、作用域
          [Injection(AsType = typeof(Config), IsSingleInstance = true, Scope= InjectionScope.Running)]
          class Config
          {
              //类实现...
          }
    • 自动注册
      所有实现了ITaskConfig接口的类都会自动注册为单例,例如:
      class Config : Mondol.Configuration, ITaskConfig
          {
              //类实现...
          }

    除了插件自己注册的类型外,框架还会注册一些接口给插件使用,例如:

    • IAppEnvironment  //APP环境
    • IEventManager  //事件管理器
    • IImmediateLogger //即时日志输出接口

    更多接口请参见Mondol.TaskHosting.Abstractions.dll程序集,这个程序集里全是接口定义,里面的接口将来都可以通过依赖注入获取到

     

    小结

    以上简单的介绍了TaskHosting的概念及基本用法,其目的就是让你可以更专注于功能业务的开发,而无需过多关心UI实现细节。

    后续会详细介绍一些高级的使用方法及示例

    使用中如有什么意见或问题欢迎随时反馈给我Q46029811

    以上提到的示例代码:单击下载

  • 相关阅读:
    函数阶乘累加求和
    函数
    枚举
    变量定义在主函数外面
    输入班级人数,姓名,分数,创建集合,并按照表格样式打印出来
    控制台输入输出
    Chapter 4、流程控制(一)--- 条件语句 (23rd,Feb)
    实战练习P62 ---比较大小,求矩形面积
    Chapter 3、Java语法基础(三)--- 运算符、数据类型转换 (22nd,Feb)
    字符集
  • 原文地址:https://www.cnblogs.com/mondol/p/taskhosting-easy.html
Copyright © 2020-2023  润新知