如何使用Topshelf与.NET泛型主机建立Windows服务
1 前置阅读
在阅读本文章之前,你可以先阅读:
- Topshelf一个用于使用.NET构建Windows服务框架
2 使用
2.1 创建应用程序
首先,创建一个新的控制台应用程序并从nuget获取Topshelf和Microsoft.Extensions.Hosting软件包
Topshelf
Microsoft.Extensions.Hosting
当然我们也需要安装Serilog相关的日志框架。
Serilog.Extensions.Hosting
Serilog.Settings.Configuration
Serilog.Sinks.Console
Serilog.Sinks.File
Topshelf.Serilog
2.2 创建.NET泛型主机
然后,我们先建立CreateHostBuilder()方法,并加载了Serilog日志并依赖注入MyService和AppSettings,MyService类做为Topshelf所使用的主要逻辑程序,它会提供Start()和Stop()做为Topshelf执行或停止主要逻辑程序的动作。
class Program
{
    static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();
    }
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(args)
            .UseSerilog()
            .ConfigureServices((hostContext, services) =>
            {
                services.Configure<AppSettings>(hostContext.Configuration);
                services.AddTransient<MyService>();
            });
}
2.3 在Topshelf中注册服务
接着,在Topshelf中注册我们的服务类。跳转到Program.cs并添加:
class Program
{
    static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();
        RunWindowsServiceWithHost(host);
    }
    private static void RunWindowsServiceWithHost(IHost host)
    {
        var rc = HostFactory.Run(x =>
        {
            x.UseSerilog();
            x.SetDisplayName("我的服务");
            x.SetDescription("我的服务详细描述");
            x.SetServiceName("MyService");
            var myService = host.Services.GetRequiredService<MyService>();
            x.Service<MyService>(s =>
            {
                s.ConstructUsing(() => myService);
                s.WhenStarted(tc => tc.Start());
                s.WhenStopped(tc => tc.Stop());
            });
            x.RunAsLocalSystem();
            x.StartAutomatically();
        });
        var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());
        Environment.ExitCode = exitCode;
    }
}
2.4 MyService类
接着,我们看看MyService类,主要演示了注入ILogger和AppSettings。
public class MyService
{
    private readonly ILogger logger;
    private readonly AppSettings settings;
    public MyService(IOptions<AppSettings> settings, ILogger<MyService> logger)
    {
        this.settings = settings.Value;
        this.logger = logger;
    }
    public void Start()
    {
        logger.LogInformation($"Starting {this.settings.ServiceName}...");
    }
    public void Stop()
    {
        logger.LogInformation($"Stopping {this.settings.ServiceName}...");
    }
}
2.5 运行应用程序
最后,F5执行应用程序,如果一切顺利,你应该会看到类似以下内容的信息:

如何使用Topshelf与.NET泛型主机建立Windows服务的更多相关文章
- Topshelf一个用于使用.NET构建Windows服务框架
		1 Topshelf是什么? Topshelf是用于托管使用.NET框架编写的Windows服务的框架.服务的创建得到简化,从而使开发人员可以创建一个简单的控制台应用程序,可以使用Topshelf将其 ... 
- 使用 Topshelf 结合 Quartz.NET 创建 Windows 服务
		Ø 前言 之前一篇文章已经介绍了,如何使用 Topshelf 创建 Windows 服务.当时提到还缺少一个任务调度框架,就是 Quartz.NET.而本文就展开对 Quartz.NET 的研究,以 ... 
- 使用Topshelf管理Windows服务
		目的:以控制台方式开发Windows服务程序,调试部署方便. https://www.cnblogs.com/itjeff/p/8316244.html https://www.cnblogs.com ... 
- 使用.NET Core创建Windows服务(二) -  使用Topshelf方式
		原文:Creating Windows Services In .NET Core – Part 2 – The "Topshelf" Way 作者:Dotnet Core Tut ... 
- TPYBoard实例之利用WHID为隔离主机建立隐秘通道
		本文作者:xiaowuyi,来自FreeBuf.COM(MicroPythonQQ交流群:157816561,公众号:MicroPython玩家汇) 0引言 从2014年BADUSB出现以后,USB- ... 
- 使用Topshelf 开发windows服务
		在业务系统中,我们为了调度一些自动执行的任务或从队列中消费一些消息,所以基本上都会涉及到后台服务的开发.如果用windows service开发,非常不爽的一件事就是:调试相对麻烦,而且你还需要了解 ... 
- 使用Topshelf组件构建简单的Windows服务
		很多时候都在讨论是否需要了解一个组件或者一个语言的底层原理这个问题,其实我个人觉得,对于这个问题,每个人都有自己的看法,个人情况不同,选择的方式也就会不同了.我个人觉得无论学习什么,都应该尝试着去了解 ... 
- .NET Core Generic Host Windows服务部署使用Topshelf
		此文源于前公司在迁移项目到.NET Core的过程中,希望使用Generic Host来管理定时任务程序时,没法部署到Windows服务的问题,而且官方也没给出解决方案,只能关注一下官方issue # ... 
- 利用Topshelf把.NET Core Generic Host管理的应用程序部署为Windows服务
		背景 2019第一篇文章. 此文源于前公司在迁移项目到.NET Core的过程中,希望使用Generic Host来管理定时任务程序时,没法部署到Windows服务的问题,而且官方也没给出解决方案,只 ... 
随机推荐
- mobile chart & f2
			mobile chart & f2 https://www.yuque.com/antv/f2/getting-started https://antv.alipay.com/zh-cn/f2 ... 
- AMP ⚡
			AMP https://amp.dev/zh_cn/ PWA AMP Playground https://playground.amp.dev/?runtime=amp4email <!doc ... 
- js showOpenFilePicker showSaveFilePicker showDirectoryPicker API
			选择文件,获取文件句柄 btn.addEventListener("click", async (e) => { try { const hFiles = await win ... 
- react 遍历 object
			@observable obj = { name: "ajanuw", age: 22, }; @computed get list() { return _.toPairs(th ... 
- 一些小Tip
			导语 个人感悟,持续更新中... 正文 无论NIO还是AIO,都没有在数据传输过程(tcp/udp)作革命性的创新.他们在传输过程的效率和传统BIO是一样的,还是会产生阻塞(网络延迟,Socket缓冲 ... 
- CentOS7上安装伪分布式Hadoop
			1.下载安装包 下载hadoop安装包 官网地址:https://hadoop.apache.org/releases.html 版本:建议使用hadoop-2.7.3.tar.gz 系统环境:Cen ... 
- HarmonyOS三方件开发指南(12)——cropper图片裁剪
			鸿蒙入门指南,小白速来!0基础学习路线分享,高效学习方法,重点答疑解惑--->[课程入口] 目录:1. cropper组件功能介绍2. cropper使用方法3. cropper组件开发实现4. ... 
- Excel小技巧之VLOOKUP()使用简单说明
			前两天人事的小姐姐需要处理一个表格,需要在一张新表中的匹配旧表的数据,由于数据量较大不知如何处理. 我告诉她使用VLOOKUP()函数,然后她不知道怎么使用.其实我也不大用,因为数据库用的多很少使用表 ... 
- 答不上的JUC笔试题
			1:有一个总任务A,分解为子任务A1 A2 A3 ...,任何一个子任务失败后要快速取消所有任务,请写程序模拟. 「请寻求最优解,不要只是粗暴wait()」 本题解题思路:Fork/Join 通常使用 ... 
- .NET测试--模拟框架NSubstitute
			.NET测试--模拟框架NSubstitute .NET测试 NSubstitute在GitHub的开源地址:https://github.com/nsubstitute/nsubstitute/do ... 
