.net 正确的'方法;挂钩';编码到WCF实例中?

.net 正确的'方法;挂钩';编码到WCF实例中?,.net,wcf,.net,Wcf,我有一个WCF服务正在运行。我将其托管在win forms应用程序中,我希望在表单上实时显示有关其使用情况的各种统计信息。显然,我不希望WCF服务中有任何代码来收集统计数据或处理任何GUI 目前,我正致力于在WCF服务中包含大量事件,这将允许表单向其中添加侦听器,以便它能够生成统计数据。这是实现我的目标的正确方法还是有一种更具体的WCF机制?一种“标准”方法是使用性能计数器,但如果您(曾经/仅仅)想向托管进程报告,这有点过分了 在我看来,您可以使用事件+侦听器。 或者使用简单的静态计数器和Int

我有一个WCF服务正在运行。我将其托管在win forms应用程序中,我希望在表单上实时显示有关其使用情况的各种统计信息。显然,我不希望WCF服务中有任何代码来收集统计数据或处理任何GUI


目前,我正致力于在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杂志的文章很好地概述了定制行为

我不确定你需要什么样的仪器,所以我真的不能说这是否适合你想要做的事情。依我看,事件+侦听器也是一个可行的解决方案。也许这两者的某种结合可能是你最好的选择