TaskHosting - 开发桌面工具原来还可以这么简单
由来
对于喜欢开发的我经常会写一些小工具,这些小工具多以功能为主,不要求漂亮、个性化的UI。但起码要保证使用方便,因此最基本的功能要有:
- GUI(图片用户界面)
- 程序配置的保存与读取(让用户在GUI上操作要方便)
- 用户使用习惯的自动记录(例如:上次关闭时窗口位置及大小等)
- 程序崩溃捕获及上报
- 实时显示运行日志(当前执行到哪步了,输出结果是什么)
- 多线程管理及调度框架
如果每个工具都要COPY一遍以上功能的代码以后维护起来是个大坑,封装成库调用呢?那每个工具都要写一遍组装UI组件的代码。
仔细想一下,其实我要写的就是一款小工具,它以实现功能为主。
那么我就需要有一个开发框架,它可以让我只专注于功能(业务)的实现,简化UI相关的编码,最好是能用一行代码就实现一个UI功能,这个开发框架现在写好了我给它取名为TaskHosting
TaskHosting初识

先来张截图看看它长什么样~_~
TaskHosting界面中大部分UI都是可以自定义的,大部分情况下只需要2-3行C#代码就可以定制一部分UI功能,如果你不会WPF也可以用WinForms定制里面的UI(通过WindowsFormsHost)。
当然我们的目标是不关心UI,专注于功能实现,让我们来看下如何使用它。
首先从Hello Word开始:
- 首先要创建一个类库项目,然后引用TaskHosting框架相关类库
- 项目属性 > 调试 > 启动操作 > 选择【启动外部程序】,路径填写TaskHosting.exe的路径
- 创建一个【任务】类 HelloWordTask.cs,代码如下(现在先不用明白什么意思,后面会有介绍):
[Task("Hello Word", IsMutilThread = true, ConfigType = typeof(Config))]
class HelloWordTask : Mondol.TaskHosting.Task
{
private readonly Config _cfg;
private readonly IImmediateLogger _immediateLogger; public HelloWordTask(Config cfg, IImmediateLogger immediateLogger)
{
_cfg = cfg;
_immediateLogger = immediateLogger;
} public override void OnRun()
{
_immediateLogger.Info($"设置1的值为: { _cfg.Setting1}");
_immediateLogger.Info($"设置2的值为: { _cfg.Setting2}");
}
}
} - 创建一个【任务】的配置类 Config.cs,代码如下:
class Config : Mondol.Configuration, ITaskConfig
{
private readonly IAppEnvironment _appEnv; public Config(IAppEnvironment appEnv)
{
this._appEnv = appEnv;
} protected override string GetConfigurationFilePath()
{
return Path.Combine(_appEnv.GetPluginDataBasePath(GetType().Assembly), "HelloWord.Config.json");
} [Category("基本设置"), DisplayName("设置1"), Description("程序设置1,存储 string 类型的设置")]
public string Setting1
{
get
{
return GetProperty(nameof(Setting1), "我是设置1的默认值");
}
set
{
SetProperty(nameof(Setting1), value);
}
} [Category("基本设置"), DisplayName("设置2"), Description("程序设置2,存储 int 类型的设置")]
public int Setting2
{
get
{
return GetProperty(nameof(Setting2), );
}
set
{
SetProperty(nameof(Setting2), value);
}
}
}
运行程序,效果如下:

怎么样,是不是很简单?
有什么功能
目前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
以上提到的示例代码:单击下载
TaskHosting - 开发桌面工具原来还可以这么简单的更多相关文章
- heX——基于 HTML5 和 Node.JS 开发桌面应用
heX 是网易有道团队的一个开源项目,允许你采用前端技术(HTML,CSS,JavaScript)开发桌面应用软件的跨平台解决方案.heX 是你开发桌面应用的一种新的选择,意在解决传统桌面应用开发中繁 ...
- heX:用HTML5和Node.JS开发桌面应用
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- node-webkit:开发桌面+WEB混合型应用的神器
顾名思义, node -webkit就是 node js+webkit. 这样做的好处显而易见,核心奥义在于,用 node js来进行本地化调用,用webkit来解析和执行HTML+JS. 快速上手 ...
- node-webkit开发桌面应用
Node-Webkit能够做什么呢?(打开链接看discuss) github 项目源:https://github.com/rogerwang 导言 node-webkit 是一个很神奇的桌面客户端 ...
- node.js 开发桌面程序, 10个令人惊讶的NodeJS开源项目
用 node-webkit 开源框架. 做企业站,杠杠地 包括电子书和支付宝系统都是node开发的,. 接收传感器发送的数据再运算...对水泵.风机.空调这些硬件进行远程控制. 细数10个令人惊讶的N ...
- (转)heX——基于 HTML5 和 Node.JS 开发桌面应用
本文转载自:http://techblog.youdao.com/?p=685 简介:heX,一个允许你采用前端技术(HTML,CSS,JavaScript)开发桌面应用软件的跨平台解决方案.是你开发 ...
- IE开发人员工具教程
写在前面 一直非常谷歌的控制台,因为我是做前端的,谷歌浏览器在我看来是解析JS最快的浏览器,所谓的熟能生巧,用熟悉了谷歌浏览器之后就特别喜欢用谷歌的控制台调试脚本.改变样式.查看HTML.查看资源加载 ...
- go 可以开发桌面应用
go 可以开发桌面应用 go 可以开发桌面应用,但并不是很舒适.可以使用的GUI库有:1.goqt,LiteIDE作者出品,Go和QT的绑定,还未发布2.go.uik,纯Go实现的并发UI工具3.wa ...
- Java开发桌面程序学习(一)——JavaFx+Jfoenix初始以及搭建
Java开发桌面程序学习(一)--JavaFx+Jfoenix初始以及搭建 前言 想做一个Java的桌面程序,但是,使用原生的Swing感觉又十分麻烦,那个布局都是拿代码设置,看着十分的乱,偶然的情况 ...
随机推荐
- android压力测试命令monkey详解
一.Monkey 是什么?Monkey 就是SDK中附带的一个工具. 二.Monkey 测试的目的?:该工具用于进行压力测试. 然后开发人员结合monkey 打印的日志 和系统打印的日志,结局测试中出 ...
- pullToRefresh下拉刷新上拉加载
PullToRefresh 是一个第三方的工程. 之前的自定义下拉刷新控件貌似不太好用,于是网上找了这个. 参考:http://www.cnblogs.com/summers/p/4343964.ht ...
- [转载]理解HTML语义化
声明: 本文转载于:freeyiyi1993博客. 原文地址:http://www.cnblogs.com/freeyiyi1993/p/3615179.html 1.什么是HTML语义化? < ...
- Log4net日志GUI配置工具
关于log4net的配置文章在园子里真的很多,但是有关GUI界面配置的文章确定太少,改写了一个以前很早的工具 以前的那个有很多的问题,这个基本的大的问题没有,可能一个小问题还是需要修改下,基本功能肯定 ...
- commons-logging和log4j
1.Apache通用日志接口(commons-logging.jar)介绍 Apache Commons包中的一个,包含了日志功能,必须使用的jar包.这个包本身包含了一个Simple Logger, ...
- 临时表VS表变量--因地制宜,合理使用
一直以来大家对临时表与表变量的孰优孰劣争论颇多,一些技术群里的朋友甚至认为表变量几乎一无是处,比如无统计信息,不支持事务等等.但事实并非如此.这里我就临时表与表变量做个对比,对于大多数人不理解或是有歧 ...
- 第十二章:Android数据存储(下)
一.SQLite介绍 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基于数据库的应用.Android的数据 ...
- 那些年我们一起追过的Linux命令
1. cd - 作用:返回上次的目录,类似于Windows的后退功能: 2. man ascii 作用:打印出八进制.十六进制和十进制的ASCII码表:(再也不用Google ASCII表啦) 3. ...
- [JS] HTML QQ分享界面js代码
@ - @ :可以自己指定分享内容等....内含JS脚本 <html> <head> <title></title> <script type=& ...
- Jenkins Git 中文乱码问题解决
解决方法: x:\Jenkins\jenkins.xml 新增蓝色粗体标记参数(-Dfile.encoding=utf-8),然后重启Jenkins服务,完毕! <arguments>-X ...