TaskHosting - 开发桌面工具原来还可以这么简单
2016-09-04 12:26
1031 查看
由来
对于喜欢开发的我经常会写一些小工具,这些小工具多以功能为主,不要求漂亮、个性化的UI。但起码要保证使用方便,因此最基本的功能要有:GUI(图片用户界面)
程序配置的保存与读取(让用户在GUI上操作要方便)
用户使用习惯的自动记录(例如:上次关闭时窗口位置及大小等)
程序崩溃捕获及上报
实时显示运行日志(当前执行到哪步了,输出结果是什么)
多线程管理及调度框架
如果每个工具都要COPY一遍以上功能的代码以后维护起来是个大坑,封装成库调用呢?那每个工具都要写一遍组装UI组件的代码。
仔细想一下,其实我要写的就是一款小工具,它以实现功能为主。
那么我就需要有一个开发框架,它可以让我只专注于功能(业务)的实现,简化UI相关的编码,最好是能用一行代码就实现一个UI功能,这个开发框架现在写好了我给它取名为TaskHosting
TaskHosting初识
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), 5); } set { SetProperty(nameof(Setting2), value); } } }
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
以上提到的示例代码:单击下载
相关文章推荐
- 原来python开发后端服务器还可以这么简单(未完成)
- 显示桌面,原来这么简单的
- ASP.NET MVC3 + Ninject.Mvc3 依赖注入原来可以这么简单
- 实体类的枚举属性--原来支持枚举类型这么简单,没有EF5.0也可以
- DAO层原来可以这么简单 FastQuery使用手册.
- 实现变色TextView及ViewPager指示器(原来可以这么简单)
- 原来这么简单就可以申请Blog了,害我还自己做了一个~
- 心电图测量原来可以这么简单
- DAO层原来可以这么简单 FastQuery使用手册.
- Java: 在dos窗口输入密码,不要把密码直接显示出来,原来可以这么简单
- 原来操控界面可以这么简单----安卓上下滑动缩放顶部图片,左右滑动结束当前Activity,及View柔和回弹效果
- javacv开发环境配置–一切原来可以这么简单
- ASP.NET MVC3 + Ninject.Mvc3 依赖注入原来可以这么简单
- JSON解析的成长史——原来还可以这么简单
- XNA Game Studio是一套有着强大功能和简单界面的游戏制作平台,游戏开发商和游戏玩家都可以使用这套工具开发针对Windows XP以及Xbox360的游戏,XNA Game Studio分为两种版本,一种是面向初学者的EXPRESS版本,还有一种
- java连连看源码分享(原来连连看这么简单,你也可以写)
- 实体类的枚举属性--原来支持枚举类型这么简单,没有EF5.0也可以
- 实体类的枚举属性--原来支持枚举类型这么简单,没有EF5.0也可以
- (原来可以这么简单)实现变色TextView及ViewPager指示器(二)
- JSON解析的成长史——原来还可以这么简单