Topshelf服务 - 从App.Config和InstanceName确定运行时配置

时间:2015-06-27 06:55:39

标签: topshelf

我想使用Topshelf创建一个Windows服务,其中运行时配置由App.config和命令行参数驱动。

换句话说,我希望配置文件(App.config)包含所有可能的配置,然后让服务根据参数选择要在运行时使用的配置 - " instance& #34;或自定义参数。

当我作为控制台应用程序运行时,我将它放在一起工作,但不作为服务工作。当作为服务运行时,...

serviceExe.exe intall -group:test

...下面的代码正确设置了displayName和description之类的东西。在ConstructUsing中传递给构造函数时,configGroup被设置为非null:

private static int Main()
{
    var msghHdlrs = ConfigurationManager.GetSection("domainMessageHandlers") as DomainMessageHandlersSection;

    string serviceName = "BDService";
    DomainEventHandlerGroup configGroup = null;

    var exitCode = HostFactory.Run(host =>
    {
        host.AddCommandLineDefinition("group", g => {
           configGroup = msghHdlrs.Groups.OfType<DomainEventHandlerGroup>().Single(group => group.Name == g);
        });
        host.ApplyCommandLine();

        host.Service<DomainEventSubscriberServiceAdapterCollection>(svc =>
        {
            svc.ConstructUsing(() =>
            {
                return new DomainEventSubscriberServiceAdapterCollection(configGroup);
            });

            svc.WhenStarted(app =>
            {
                app.StartAll();
            }).BeforeStartingService(t => t.RequestAdditionalTime(TimeSpan.FromSeconds(10)));

            svc.WhenStopped(app =>
            {
                app.StopAll();
            });
        });

        host.SetServiceName(serviceName);
        host.SetInstanceName(configGroup.Name);
        host.SetDisplayName(configGroup.DisplayName);
        host.SetDescription(configGroup.Description);

        host.RunAsNetworkService();
    });

    return (int)exitCode;
}

从底线看,似乎configGroup被设置用于host.Service以外的东西,但不在其中。那是为什么?

更重要的是,我正在尝试做什么?我错过了什么吗?

修改

看起来我的配置与Single command line parameter to control Topshelf windows service

相同

然而它并没有为我工作......

1 个答案:

答案 0 :(得分:0)

  

更重要的是,我正在尝试做什么?

不,这是不可能的。命令行参数不会传递给服务的启动命令。有一个ImagePath注册表项,用于保存在服务启动时执行的命令。提供的命令行参数不包含在那里。

这不太可能成为我们支持Topshelf的功能,因为很难说明为什么活动有效或无效。如果你使用不同的参数运行start但是它们没有被传递会发生什么?如果您想出一个不会让最终用户感到困惑的提案,我会很乐意考虑实施它。此时,从app.config执行所有配置是受支持的解决方案。