.net 正确的'方法;挂钩';编码到WCF实例中?
我有一个WCF服务正在运行。我将其托管在win forms应用程序中,我希望在表单上实时显示有关其使用情况的各种统计信息。显然,我不希望WCF服务中有任何代码来收集统计数据或处理任何GUI.net 正确的'方法;挂钩';编码到WCF实例中?,.net,wcf,.net,Wcf,我有一个WCF服务正在运行。我将其托管在win forms应用程序中,我希望在表单上实时显示有关其使用情况的各种统计信息。显然,我不希望WCF服务中有任何代码来收集统计数据或处理任何GUI 目前,我正致力于在WCF服务中包含大量事件,这将允许表单向其中添加侦听器,以便它能够生成统计数据。这是实现我的目标的正确方法还是有一种更具体的WCF机制?一种“标准”方法是使用性能计数器,但如果您(曾经/仅仅)想向托管进程报告,这有点过分了 在我看来,您可以使用事件+侦听器。 或者使用简单的静态计数器和Int
目前,我正致力于在WCF服务中包含大量事件,这将允许表单向其中添加侦听器,以便它能够生成统计数据。这是实现我的目标的正确方法还是有一种更具体的WCF机制?一种“标准”方法是使用性能计数器,但如果您(曾经/仅仅)想向托管进程报告,这有点过分了 在我看来,您可以使用事件+侦听器。
或者使用简单的静态计数器和Interlocked.Increment(),这将是最快的方法。正如所建议的那样,静态计数器、事件和侦听器在技术上可以做到这一点,但如果您的目标是更通用的解决方案,则可以通过依赖注入(DI)来实现 首先,您需要在WCF服务和托管应用程序之间共享的。您可以从WCF服务向该中介写入消息,然后它可以将这些消息分发到主机中的相应处理程序 您需要将中介注入WCF服务。您可以通过使用自定义的
ServiceHost
来完成此操作,该主机将自定义的IInstanceProvider
分配给服务合同。在我的书的第7章出版之前,我所知道的关于如何为WCF启用构造函数注入的最佳概述是,如果您记住
在适当的地方,考虑将统计记录器实现为“真实”服务,因为这将给您更好的<强>分离关注> <强>。大概是这样的:
[ServiceContract]
public interface IMyService
{
[OperationContract]
Foo DoStuff(Bar bar);
}
public class StatisticsDecorator : IMyService
{
private readonly IMyService service;
private readonly IMediator mediator;
public StatisticsDecorator(IMyService service, IMediator mediator)
{
if(service == null)
{
throw new ArgumentNullException("service");
}
if(mediator == null)
{
throw new ArgumentNullException("mediator");
}
this.service = service;
this.mediator = mediator;
}
public Foo DoStuff(Bar bar)
{
this.mediator.SignalBeforeDoStuff();
var result = this.service.DoStuff(bar);
this.mediator.SignalAferDoStuff();
return result;
}
}
在运行时,您将把IMyService的“真实”实现与共享中介一起注入statisticsdecommator
如果您使用DI容器,您可能可以使用其拦截功能,而不是手动使用装饰器,但概念是相同的。WCF还提供开发自定义行为的能力,允许您检查和扩展服务方法调用的各个方面。例如,存在可定制的行为来检查方法参数、检查消息内容以及控制如何调用操作。MSDN杂志的文章很好地概述了定制行为 我不确定你需要什么样的仪器,所以我真的不能说这是否适合你想要做的事情。依我看,事件+侦听器也是一个可行的解决方案。也许这两者的某种结合可能是你最好的选择