我想使用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
相同然而它并没有为我工作......
答案 0 :(得分:0)
更重要的是,我正在尝试做什么?
不,这是不可能的。命令行参数不会传递给服务的启动命令。有一个ImagePath注册表项,用于保存在服务启动时执行的命令。提供的命令行参数不包含在那里。
这不太可能成为我们支持Topshelf的功能,因为很难说明为什么活动有效或无效。如果你使用不同的参数运行start但是它们没有被传递会发生什么?如果您想出一个不会让最终用户感到困惑的提案,我会很乐意考虑实施它。此时,从app.config执行所有配置是受支持的解决方案。