您的位置:首页 > 其它

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

以上提到的示例代码:单击下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐