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 }

  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     }

运行程序,效果如下:

怎么样,是不是很简单?

有什么功能

目前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

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

时间: 2024-10-25 12:17:19

TaskHosting - 开发桌面工具原来还可以这么简单的相关文章

程序员必备简捷开发辅助工具总结

程序员必备简捷开发辅助工具总结 本文独家授权给stormzhang运营的公众号AndroidDeveloper,拒绝其他任何形式的转载. 写在前面: 工欲善其事必先利其器,拥有简捷的开发辅助工具能大大提高我们程序猿的开发效率.Melo刚到学校就给大家总结了一些常用的辅助开发的工具,希望大家能喜欢,闲话不多说,马上开始~! 零:Notepad++ Notepad++ 程序员必备的文本编辑器,软件小巧高效,支持27种编程语言,通吃C,C++ ,Java ,C#, XML, HTML, PHP,JS

八款最佳的远程桌面工具

远程桌面是微软公司为了方便网络管理员管理维护服务器而推出的一项服务.从windows 2000 server版本开始引入,网络管理员使用远程桌面连接程序连接到网络任意一台开启了远程桌面控制功能的计算机上,就好比自己操作该计算机一样,运行程序,维护数据库等. 远程桌面采用的是一种类似TELNET的技术,它是从TELNET协议发展而来的,通俗的讲远程桌面就是图形化的TELNET. 下面向大家介绍八款最佳的远程桌面工具. 1. Teamviewer 地址: http://www.teamviewer.

node-webkit开发桌面应用

之前有一篇博文提到过node-webkit和有道的hex,今天就node-webkit开发做一个详细介绍吧. 顾名思义,node-webkit就是nodejs+webkit.这样做的好处显而易见,核心奥义在于,用nodejs来进行本地化调用,用webkit来解析和执行HTML+JS. 快速上手 下载node-webkit 点击这里:https://github.com/rogerwang/node-webkit 找到Downloads这一小节,然后下载对应平台的node-webkit预编译包.(

(转)heX——基于 HTML5 和 Node.JS 开发桌面应用

本文转载自:http://techblog.youdao.com/?p=685 简介:heX,一个允许你采用前端技术(HTML,CSS,JavaScript)开发桌面应用软件的跨平台解决方案.是你开发桌面应用的一种新的选择,意在解决传统桌面应用开发中繁琐的UI和交互开发工作,使其变的简单而高效.特别适合重UI,重交互的桌面应用软件. 欢迎关注http://hex.youdao.com  或微博 @youdao_hex. 一.项目背景 二.用heX开发桌面应用的优势 三.如何用heX开始一个桌面应

go 可以开发桌面应用

go 可以开发桌面应用 go 可以开发桌面应用,但并不是很舒适.可以使用的GUI库有:1.goqt,LiteIDE作者出品,Go和QT的绑定,还未发布2.go.uik,纯Go实现的并发UI工具3.walk,Windows Application Library Kit4.gform,Windows GUI framework 目前的话walk用得比较多 不过go的GUI库用起来没有C#.C/C++的那么顺手. 这个问题不久之后应该会有所改善,毕竟用Go开发桌面的需求在不断增加. 目前我采用的是用

node-webkit:开发桌面+WEB混合型应用的神器

node-webkit:开发桌面+WEB混合型应用的神器 大漠穷秋 2014-01-31 bla...bla... 顾名思义,node-webkit就是nodejs+webkit. 这样做的好处显而易见,核心奥义在于,用nodejs来进行本地化调用,用webkit来解析和执行HTML+JS. 快速上手 下载node-webkit 点击这里: https://github.com/rogerwang/node-webkit 找到Downloads这一小节,然后下载对应平台的node-webkit预

IE开发人员工具教程

写在前面 一直非常谷歌的控制台,因为我是做前端的,谷歌浏览器在我看来是解析JS最快的浏览器,所谓的熟能生巧,用熟悉了谷歌浏览器之后就特别喜欢用谷歌的控制台调试脚本.改变样式.查看HTML.查看资源加载等信息. 在这儿推荐两篇关于谷歌控制台怎么使用的三篇博文(在我看来这三篇博文是我看过介绍谷歌控制台最佳最全的使用手册啦) Chrome 控制台不完全指南   http://www.cnblogs.com/Wayou/p/chrome-console-tips-and-tricks.html Chro

C#跨平台手机应用开发工具Xamarin尝试 与Eclipse简单对比

Xamarin 支持使用C#开发基于Android.IOS.WindowsPhone应用开发,最大特点C#+跨平台,详细说明问度娘. 安装 研究 想体验研究的点击查看页面 Xamarin For Visual Studio 3.0.54.0 完整离线破解版 我也下载了研究下,破解有时候有问题,一登陆就变成试用版,需要重新生成License,挺烦人,于是写了段批处理,放入记事本中另存为crack.bat执行,则可再次生成License. @Entitlements.bak为破解后生成的Entitl

BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发人员工具 SharePoint开发的其他工具

BEGINNING SHAREPOINT? 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发人员工具 SharePoint开发的其他工具 本章节讲了很多SP开发可用的核心工具.当然,除了这些主流的,你还会碰到一些不错的工具--一些可能是你组织中专有的.两个较少人知道的工具在一些情境中是很有帮助的:Expression Blend--设计用,特别是当你构建基于Silverlight的应用程序:Fiddler--调试用. 使用Expression Blend开发 V