2010-03-10 65 views
1

我有一個WCF服務啓動並運行。我有它在一個勝利形式的應用程序託管,我想有各種統計數據關於它的使用情況實時顯示在窗體上。顯然,我不希望WCF服務中的任何代碼收集統計信息或處理任何GUI。將代碼掛鉤到WCF實例中的正確方法?

目前我正在努力使WCF服務內部有多個事件,這將允許表單添加偵聽器,以便它可以生成其統計信息。這是實現我的目標的正確方法,還是有更多的WCF特定機制?

回答

1

如前所述,靜態計數器或事件和聽衆可能會在技術上做到這一點,但如果您打算使用更通用的解決方案,則可以使用依賴注入(DI)實施。

首先,您需要在WCF服務和託管應用程序之間共享的Mediator。您可以從WCF服務將消息寫入該中介程序,然後它可以將這些消息分發給主機中的相應處理程序。

您需要將Mediator注入到WCF服務中。您可以通過使用自定義ServiceHost來實現此目的,該服務將自定義IInstanceProvider分配給服務合同。直到我的書的第7章出來,如果您記住delegate is just an anonymous interface,我知道如何爲WCF啓用構造函數注入的最佳輪廓是this blog post

隨着這一點,考慮實施統計記錄器作爲Decorator到'真正'的服務,因爲這會給你更好的分離關注。事情是這樣的:

[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到StatisticsDecorator在一起。

如果您使用DI容器,您可能可以使用其攔截功能而不是手動滾動裝飾器,但概念是相同的。

1

'標準'的方法是使用性能計數器,但是如果你(只/)只想報告給託管進程有點矯枉過正。

你可以使用events + listeners,對我來說似乎很好。
或者使用簡單的靜態計數器和Interlocked.Increment(),這將是最快的方法。

0

WCF還提供了開發自定義行爲的功能,允許您檢查和擴展服務方法調用的各個方面。例如,存在可定製的行爲來檢查方法參數,檢查消息內容並控制操作的調用方式。 This MSDN雜誌文章很好地概述了自定義行爲。

我不確定你的儀器需求是什麼,所以我不能確定這是否適合你想要做的事情。恕我直言,事件+聽衆也是一個可行的解決方案。也許即使是這兩者的一些組合也許是你最好的選擇。