.NET Core 創建Windows服務


.NET Core 創建Windows服務

作者:高堂
原文地址:https://www.cnblogs.com/gaotang/p/10850564.html

寫在前面

使用 TopShelf+Autofac+AutoMapper+Quartz+NLog 完成現有項目定時調度任務

1.相關NetGet包

  • 依賴注入 Alexinea.Autofac.Extensions.DependencyInjection
  • 對象映射 AutoMapper.Extensions.Microsoft.DependencyInjection
  • 調度 Autofac.Extras.Quartz
  • Topshelf注入 Topshelf.Autofac
  • Topshelf日志 Topshelf.NLog/Topshelf.Log4Net

2.添加Autofac自動映射服務

  • 引入 Alexinea.Autofac.Extensions.DependencyInjection

3.添加AutoMapper自動映射類

  • 引入 AutoMapper.Extensions.Microsoft.DependencyInjection
  • 添加測試類 User、UserDto
  • 添加服務類 IUserRepository、UserRepository、IUserService、UserService,獲取配置文件中的User信息並轉換為業務模型UserDto
  • 添加映射配置文件 MapperProfiles
  • 添加Autofac擴展 AutoMapperExtensions
public static class AutoMapperExtensions
{
    public static ContainerBuilder ConfigureAutoMapper(this ContainerBuilder builder)
    {
        builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
            .AsClosedTypesOf(typeof(ITypeConverter<,>))
            .AsImplementedInterfaces();
        builder.RegisterAssemblyTypes(typeof(AutoMapperExtensions).Assembly)
            .AssignableTo<Profile>().As<Profile>();

        builder.Register(c => {
            var profiles = c.Resolve<IEnumerable<Profile>>();
            var context = c.Resolve<IComponentContext>();
            return new MapperConfiguration(x => {
                foreach (var profile in profiles) x.AddProfile(profile);
                x.ConstructServicesUsing(context.Resolve);
            });
        }).SingleInstance().AsSelf();

        builder.Register(c => {
            var context = c.Resolve<IComponentContext>();
            var config = context.Resolve<MapperConfiguration>();
            return config.CreateMapper();
        }).As<IMapper>();

        return builder;
    }
}
  • 添加自定義服務擴展 ServicesExtensions
public static class ServicesExtensions
{
    public static ContainerBuilder ConfigureSelf(this ContainerBuilder builder)
    {
        var services = new ServiceCollection();
        // register appsettings.json
        services.Configure<User>("UserConfig", Settings.Instance.Configuration.GetSection("User"));
        builder.Populate(services);
        // register services repositories
        builder.RegisterAssemblyTypes(typeof(UserRepository).Assembly)
                .Where(t => t.Name.EndsWith("Repository"))
                .AsImplementedInterfaces();
        builder.RegisterAssemblyTypes(typeof(UserService).Assembly)
                .Where(t => t.Name.EndsWith("Service"))
                .AsImplementedInterfaces();

        return builder;
    }
}

4.添加Quartz調度任務

  • 引入 Autofac.Extras.Quartz
  • 添加調度任務類 MyJob1
  • 添加Autofac擴展 QuartzExtensions
public static ContainerBuilder ConfigureQuartz(this ContainerBuilder builder)
{
    // 1) Register IScheduler
    builder.RegisterModule(new QuartzAutofacFactoryModule());
    // 2) Register jobs
    builder.RegisterModule(new QuartzAutofacJobsModule(typeof(MyJob1).Assembly));

    return builder;
}

5.添加日志

  • 引入 NLog.Extensions.Logging

6.創建TopShelf服務

  • 引入 Topshelf.NLog
  • 引入 Topshelf.Autofac

7.發布並添加Windows服務

  • 發布為獨立文件

  • 添加安裝(install.bat)和卸載文件(uninstall.bat)
cd /d %~dp0
Sample.Topshelf.exe install
pause
cd /d %~dp0
Sample.Topshelf.exe uninstall
pause

源碼

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM