所以我们已经制作了一个Windows服务来将数据提供给我们的客户端应用程序,一切都很顺利.客户端提出了一个有趣的配置请求,该请求要求在同一服务器上运行此服务的两个实例,并将其配置为指向不同的数据库.
到目前为止,我还没有能够实现这一点,并希望我的同事stackoverflow成员可以提供一些提示,为什么.
目前的设置:
我已经设置了包含windows服务的项目,从现在开始我们称之为AppService,以及处理自定义安装步骤的ProjectInstaller.cs文件,根据App.config中的键设置服务名称,如此:
this.serviceInstaller1.ServiceName = Util.ServiceName;
this.serviceInstaller1.DisplayName = Util.ServiceName;
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Util只是一个静态类,可以从配置文件中加载服务名称.
从这里开始,我尝试了两种不同的方法来安装这两种服务,并且都以相同的方式失败.
第一种方法是简单地安装服务的第一个副本,复制已安装的目录并重命名,然后在修改应用程序配置后运行以下命令以更改所需的服务名称:
InstallUtil.exe /i AppService.exe
Run Code Online (Sandbox Code Playgroud)
当这不起作用时,我尝试创建第二个安装程序项目,编辑配置文件并构建第二个安装程序.当我运行安装程序时它工作正常,但服务没有显示在services.msc中,所以我针对第二个安装的代码库运行了上一个命令.
两次我都收到了InstallUtil的以下输出(仅限相关部分):
运行事务安装.
开始安装的安装阶段.
安装服务App Service Two ... Service App Service 2已成功安装.在日志应用程序中创建EventLog源App Service二...
安装阶段发生异常.System.NullReferenceException:未将对象引用设置为对象的实例.
安装的回滚阶段正在开始.
将事件日志还原到源App Service 2的先前状态.服务应用程序服务2正在从系统中删除...服务应用程序服务2已成功从系统中删除.
回滚阶段成功完成.
事务处理安装已完成.安装失败,并且已执行回滚.
对于冗长的帖子感到抱歉,想确保有足够的相关信息.到目前为止已经难倒我的部分是,它指出该服务的安装成功完成和它关系到创建的NullReferenceException异常似乎得到抛出的事件日志源之后.因此,如果有人知道我做错了什么或有更好的方法,那将非常感激.
<DataTemplate x:Key="_ItemTemplateA">
<Grid Tag="{Binding Path=DataContext.Command, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ContentControl Content="{Binding}" ContentTemplate="{StaticResource ContentTemplateB}" Grid.Row="0" />
<ContentControl Name="uiContentPresenter" Content="{Binding ContentView}" Grid.Row="1" Height="0" />
<ContentControl DataContext="{Binding IsContentDisplayed}" DataContextChanged="IsDisplayed_Changed" Visibility="Collapsed" />
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Header="Text"
Command="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"
CommandParameter="{Binding}" />
</ContextMenu>
</Grid.ContextMenu>
</Grid>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
以上数据模板应用于ItemsControl.问题是,对于为Grid指定的ContextMenu,PlacementTarget属性实际上永远不会被设置为任何东西,所以我无法获得Grid的Tag属性,这是传递应该在父UserControl上执行的Command所必需的到上下文菜单.我基于这样的类似示例来建立这种方法:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/0244fbb0-fd5f-4a03-bd7b-978d7cbe1be3/
我无法确定任何其他传递此命令的好方法.这是以这种方式设置的,因为我们正在使用MVVM方法,因此我们必须执行的命令存在于应用此模板的用户控件的视图模型中.我尝试以几种不同的方式显式设置PlacementTarget但它仍然总是显示为未设置.