对于喜欢开发的我经常会写一些小工具,这些小工具多以功能为主,不要求漂亮、个性化的 UI。但起码要保证使用方便,因此最基本的功能要有:
如果每个工具都要 COPY 一遍以上功能的代码以后维护起来是个大坑,封装成库调用呢?那每个工具都要写一遍组装 UI 组件的代码。
仔细想一下,其实我要写的就是一款小工具,它以实现功能为主。
那么我就需要有一个开发框架,它可以让我只专注于功能(业务)的实现,简化 UI 相关的编码,最好是能用一行代码就实现一个 UI 功能,这个开发框架现在写好了我给它取名为 TaskHosting
先来张截图看看它长什么样~_~
TaskHosting 界面中大部分 UI 都是可以自定义的,大部分情况下只需要 2-3 行 C# 代码就可以定制一部分 UI 功能,如果你不会 WPF 也可以用 WinForms 定制里面的 UI(通过 WindowsFormsHost)。
当然我们的目标是不关心 UI,专注于功能实现,让我们来看下如何使用它。
首先从 Hello Word 开始:
View Code
- 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
- 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 有如下功能:
以上功能均可灵活的自定义,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().AsSelf();
- }
- }
- //通过属性注入,可指定是否单例、作用域
- [Injection(AsType = typeof(Config), IsSingleInstance = true, Scope = InjectionScope.Running)] class Config {
- //类实现...
- }
- class Config: Mondol.Configuration,
- ITaskConfig {
- //类实现...
- }
除了插件自己注册的类型外,框架还会注册一些接口给插件使用,例如:
更多接口请参见 Mondol.TaskHosting.Abstractions.dll 程序集,这个程序集里全是接口定义,里面的接口将来都可以通过依赖注入获取到
以上简单的介绍了 TaskHosting 的概念及基本用法,其目的就是让你可以更专注于功能业务的开发,而无需过多关心 UI 实现细节。
后续会详细介绍一些高级的使用方法及示例
使用中如有什么意见或问题欢迎随时反馈给我 Q46029811
以上提到的示例代码:
来源: http://www.cnblogs.com/mondol/p/taskhosting-easy.html