Topshelf 服务 - 根据 App.Config 和 InstanceName 确定运行时配置
Topshelf Service - Determine Runtime Configuration From App.Config and InstanceName
我想创建一个 windows 服务,使用 Topshelf,其中 运行时间配置由 App.config 和命令行参数驱动。
换句话说,我希望配置文件 (App.config) 包含所有可能的配置,然后让服务 select 在 运行 时使用配置基于参数 - "instance" 或自定义参数。
当 运行 作为控制台应用程序时,我放在一起的东西可以工作,但不能作为服务工作。当 运行 作为服务时,...
serviceExe.exe intall -group:test
...下面的代码正确设置了 displayName 和 description 等内容。在 ConstructUsing:
期间传递给构造函数时,不会发生的是 configGroup 被设置为非空
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
一样
但它对我不起作用...
More importantly, is what I'm trying to do possible?
不,这不可能。命令行参数不会传递给服务的启动命令。有一个 ImagePath 注册表项,用于保存在服务启动时执行的命令。此处不包含提供的命令行参数。
这不太可能是我们将支持 Topshelf 的功能,因为很难推断 activity 有效或无效的原因。如果您 运行 从不同的论点开始但他们没有被传递,会发生什么?如果您提出的建议最终不会让最终用户感到困惑,我很乐意考虑实施它。此时,从 app.config 进行所有配置是受支持的解决方案。
我想创建一个 windows 服务,使用 Topshelf,其中 运行时间配置由 App.config 和命令行参数驱动。
换句话说,我希望配置文件 (App.config) 包含所有可能的配置,然后让服务 select 在 运行 时使用配置基于参数 - "instance" 或自定义参数。
当 运行 作为控制台应用程序时,我放在一起的东西可以工作,但不能作为服务工作。当 运行 作为服务时,...
serviceExe.exe intall -group:test
...下面的代码正确设置了 displayName 和 description 等内容。在 ConstructUsing:
期间传递给构造函数时,不会发生的是 configGroup 被设置为非空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
一样但它对我不起作用...
More importantly, is what I'm trying to do possible?
不,这不可能。命令行参数不会传递给服务的启动命令。有一个 ImagePath 注册表项,用于保存在服务启动时执行的命令。此处不包含提供的命令行参数。
这不太可能是我们将支持 Topshelf 的功能,因为很难推断 activity 有效或无效的原因。如果您 运行 从不同的论点开始但他们没有被传递,会发生什么?如果您提出的建议最终不会让最终用户感到困惑,我很乐意考虑实施它。此时,从 app.config 进行所有配置是受支持的解决方案。