前言

此文欢迎转载,原始链接地址:http://www.cnblogs.com/DjlNet/p/7603819.html


正文

原先也偶然见过这个关键词,当时只是有个大致了解貌似和WinService开发有关系,此前在对Quartz.Net了解的时候再次接触到TopShelf,这个时候博主就认为不能一笔带过了,此框架需要另起一篇小文对于它有一个稍微更加详细的说明与实践,看看当对于原生的winservice开发或许方便了许多在哪里,那么今天我们就综合园友的文章以及官方文档的脚步学习一下吧......


TopShelf

这里优先给出地址:https://github.com/topshelf/topshelf,同时这里引用一下官方的描述:An easy service hosting framework for building Windows services using .NET。一个使用.NET能够简单构建windows服务的自托管开发框架,且可以在安装了mono的linux上面运行也实现了一定程度上面的跨平台,同时我们看到star的数量超过2K,也说明了在这块一定的受欢迎程度。它能够让服务的创建被简化,允许开发人员创建一个简单的控制台应用程序,可以使用Topshelf作为服务安装。这样一来调试控制台应用程序比服务容易得多,也不用挂载进程调试了,而且一旦应用程序经过测试并可以进行生产,Topshelf可以轻松安装应用程序作为服务,几行cmd命令都搞定了。接下来就按照文档来说一说它,这里博主还是选取些觉得重要些的东西记录....


TopShelf至少得在.NET3.5SP1及其以上的环境中运行,它需要.NET环境运行时才能够运行
下面的代码来自与官方例子,其中较好的说明了使用方法以及常用配置说明:

public class TownCrier
{readonly Timer _timer;public TownCrier(){_timer = new Timer(1000) {AutoReset = true};_timer.Elapsed += (sender, eventArgs) => Console.WriteLine("It is {0} and all is well", DateTime.Now);}public void Start() { _timer.Start(); }public void Stop() { _timer.Stop(); }
}public class Program
{public static void Main(){HostFactory.Run(x =>                                {x.Service<TownCrier>(s =>                       {s.ConstructUsing(name=> new TownCrier());    s.WhenStarted(tc => tc.Start());             s.WhenStopped(tc => tc.Stop());              });x.RunAsLocalSystem();                            x.SetDescription("Sample Topshelf Host");       x.SetDisplayName("Stuff");                       x.SetServiceName("Stuff");                       });                                                  }
}

大致从上面代码就可以看出一些使用方式和套路,同时我们也发现了一个应用场景就是适合常驻任务进程,例如一些定时任务或者被动触发类(消费消息队列什么的)的程序来作为主要逻辑,正好就是场景应用比较好的体现。


服务配置方面,提供了两种配置方式,不过道理都一样,(1)将你的自定义逻辑实现接口ServiceControl ,然后在 HostFactory.New(x =>
{ x.Service<MyService>(); });
添加即可,这种方式还可以指定依赖项,当然也可以依赖注入(2)

HostFactory.New(x =>
{x.Service<MyService>(sc =>{sc.ConstructUsing(() => new MyService());// the start and stop methods for the servicesc.WhenStarted(s => s.Start());sc.WhenStopped(s => s.Stop());// optional pause/continue methods if usedsc.WhenPaused(s => s.Pause());sc.WhenContinued(s => s.Continue());// optional, when shutdown is supportedsc.WhenShutdown(s => s.Shutdown());});
});

这种自定义服务的方式适合零依赖,控制灵活推荐使用,当然爱怎么注入与解析都提供了机会

服务启动方式,这里TopShelf提供了4种,其实也是winservice的那几种方式了,这里
x.StartAutomatically(); // Start the service automatically 自动启动
x.StartAutomaticallyDelayed(); // Automatic (Delayed) -- only available on .NET 4.0 or later 自动延迟启动
x.StartManually(); // Start the service manually 手动
x.Disabled(); // install the service as disabled 禁用

服务恢复:EnableServiceRecovery 主要配置项目如下:(具体可以看API的描述即可)

HostFactory.New(x =>
{x.EnableServiceRecovery(r =>{//you can have up to three of theser.RestartComputer(5, "message");r.RestartService(0);//the last one will act for all subsequent failuresr.RunProgram(7, "ping google.com");//should this be true for crashed or non-zero exitsr.OnCrashOnly();//number of days until the error count resetsr.SetResetPeriod(1);});
});

要配置服务恢复选项,配置程序可用于指定一个或多个服务恢复操作。恢复选项仅在安装服务时使用,并在服务成功安装后设置。恢复操作按照指定的顺序执行,下一个操作在上一个操作运行后再执行,在服务失败复苏时。存在可以执行多少动作的限制(基于OS),通常是2-3动作。

服务运行身份标识:x.RunAs("username", "password"); x.RunAsPrompt(); x.RunAsNetworkService(); x.RunAsLocalSystem(); x.RunAsLocalService();
自定义服务安装卸载行为(注入委托):x.BeforeInstall(() => { ... }); x.AfterInstall(() => { ... }); x.BeforeUninstall(() => { ... }); x.AfterUninstall(() => { ... });
服务依赖:可以指定服务依赖关系,以便在从属服务启动之前服务不会启动。这由Windows服务控制管理器管理,而不是由Topshelf本身管理。x.DependsOn("SomeOtherService");,这里TopShelf框架内置了几个常用的依赖性配置:
x.DependsOnMsmq(); // Microsoft Message Queueing
x.DependsOnMsSql(); // Microsoft SQL Server
x.DependsOnEventLog(); // Windows Event Log
x.DependsOnIis(); // Internet Information Server

高级配置: x.EnablePauseAndContinue();允许暂停和继续,这里考虑到某些任务具有如此需求场景,例如定时器等等; x.EnableShutdown(); 指定该服务支持shutdown服务命令,允许服务控制管理器快速关闭服务。

HostFactory.New(x =>
{x.OnException(ex =>{// Do something with the exception});
});

为服务运行时抛出的异常提供回调。这个回调函数不是处理程序,不会影响Topshelf已经提供的默认异常处理。旨在提供触发外部操作,日志等的抛出异常的可见性。

Logging Integration with Topshelf (日志集成):默认情况下,Topshelf使用TraceSource进行日志记录。这是.NET框架的一部分,因此不会引入任何额外的依赖关系。但是,许多应用程序使用更高级的日志库,例如Log4net或NLog。为了支持这一点,Topshelf使用了可扩展的日志界面。x.UseLog4Net();利用Topshelf.Log4Net即可轻松集成,这将使HostLogger更改为使用log4net。有一个重载可以指定一个配置文件。如果给定,文件名将被解析到ApplicationBase文件夹并传递给log4net以配置日志追加器和级别;x.UseNLog();依赖Topshelf.NLog,同理这将更改HostLogger以使用NLog,也可以使用相同方法的重载来传递现有的LogFactory。

Topshelf Command-Line Reference(Topshelf命令行参考):这里直接给出参考地址:https://topshelf.readthedocs.io/en/latest/overview/commandline.html,内容差不多很详细了


小总结

其实整体来说,TopShelf已经封装了挺优秀了,使用方便以及API的友好性方面都做得挺不错,所以也值得我们学习和研究,此文大致上基本也是对文档内容做了一个大致摘录和整理,要说有什么干货也就这样了,不过我们由此得出学习或者研究一个新玩意,来的最直接就是阅读官方文档和一些参考实现。


参考

http://www.cnblogs.com/pengze0902/p/6602737.html 使用Topshelf组件构建简单的Windows服务,这里顺便引用一下地址博主的图片作为参考(图片来源于上面地址):

转载于:https://www.cnblogs.com/DjlNet/p/7603819.html

【框架学习与探究之宿主服务--Topshelf】相关推荐

  1. Netty网络框架学习笔记-16(心跳(heartbeat)服务源码分析)

    Netty网络框架学习笔记-16(心跳(heartbeat)服务源码分析_2020.06.25) 前言: Netty 作为一个网络框架,提供了诸多功能,比如编码解码等,Netty 还提供了非常重要的一 ...

  2. 框架学习与探究之AOP--Castle DynamicProxy

    前言 先说一点废话,在此之前博主也在早期就接触了或者看了些许AOP相关的文章,然后再去做了一些相关的实验,但是始终没有将AOP内化到自己的内功心法当中去,包括从概念还是应用环境,以及当前生态当中的AO ...

  3. Java微服务学习笔记(一):微服务架构的概念理解

    Java微服务学习笔记 Tips:入门学习时粗略整理,仅供参考 (一):架构的基础理解 文章目录 Java微服务学习笔记 前言 一.微服务是什么? 二.常用开源微服务框架演化 1. Dubbo 2. ...

  4. Sharepoin学习笔记—架构系列—Sharepoint服务(Services)与服务应用程序框架(Service Application Framework) 1

    Sharepoin学习笔记-架构系列-Sharepoint服务(Services)与服务应用程序框架(Service Application Framework) 1 Sharepoint服务是Sha ...

  5. Spring clud 微服务框架学习

    Spring clud 微服务框架学习 什么是微服务? 微服务是一种架构风格:服务组件化.业务分离让每个模块独立.服务跟服务之间接口调用,服务之间不会相互影响.轻量级通信机制:接口调用很快. 微服务的 ...

  6. kratos mysql_kratos微服务框架学习笔记一(kratos-demo)

    本文将为您描述kratos微服务框架学习笔记一(kratos-demo),教程操作步骤: 目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服 ...

  7. 用Swift写服务端 — Perfect框架学习(一)

    用Swift写服务端 - Perfect框架学习(一) 一.Perfect简介 Perfect是一组完整.强大的工具箱.软件框架体系和Web应用服务器,可以在Linux.iOS和macOS (OS X ...

  8. 学习笔记:SpringCloud 微服务技术栈_实用篇①_基础知识

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 前言 学习视频链接 SpringCloud + RabbitMQ + Docker + Redis + 搜 ...

  9. 老张 .NetCore与Vue 框架学习

    缘起 作为一个.Net攻城狮已经4年有余了,一直不温不火,正好近来项目不是很忙,闲得无聊,搞一搞新技术,一方面是打发无聊的时间,一方面也是督促自己该学习辣!身边的大神都转行的转行,加薪的加薪,本人比较 ...

最新文章

  1. haslayout详解
  2. 理解ROS话题---ROS学习第5篇
  3. c 语言冒泡排序,c 语言冒泡排序
  4. 【学习笔记】低代码平台(LCAP:Low-Code Application Platform)
  5. TCP、UDP、IP 协议分析
  6. [09-01]JavaScript 基础语法
  7. Linux 命令之 kill -- 杀死进程
  8. 《代码整洁之道 Clean Architecture》-读书笔记
  9. 天龙八部网单服务器技能修改,天龙八部3门派技能修改介绍
  10. contenteditable获得焦点后的边框设置
  11. 硬件创业者们,如何避免掉到供应链的大坑里爬不出来
  12. jquery选择器之过滤选择器
  13. 解决Putty或CRT软件连接虚拟机上面的linux连接不上的问题:如连接超时或拒绝连接
  14. 杭州电子科技大学第三届网络攻防大赛初赛题目
  15. html网站右侧广告位,分享一个html+css对联广告位的代码,网站通用
  16. 泛微Ecology8.0移动端模板必填字段JS代码
  17. Visio安装失败 无法打开注册表项 解决方案
  18. 如何开发一个 WPS 加载项
  19. 江苏辖区农商银行2020年(科技类)
  20. bzoj1022 约翰的游戏 反SG-博弈

热门文章

  1. 拟Linux服务器(中标麒麟)安装DM数据库-静默安装
  2. ROS机器人开发实践——ROS自定义消息
  3. STM32输出PWM波形及LED呼吸灯
  4. js计算农历节气的插件
  5. android5.1.1能玩的大型游戏,单机游戏:高配手机玩游戏最值得玩的大型单机游戏推荐,第一个人人都想玩...
  6. 【巴比伦周报】2019第5周
  7. H5项目dialog弹框封装
  8. 快手调整员工福利:取消免费下午茶和免费三餐、减少房补,但新增了这项福利...
  9. 色眼识人[转] -- yet another 心理测试
  10. 层位追踪matlab,隧道衬砌层位在探地雷达成像中的自动识别