我有一個WCF服務啓動並運行。我有它在一個勝利形式的應用程序託管,我想有各種統計數據關於它的使用情況實時顯示在窗體上。顯然,我不希望WCF服務中的任何代碼收集統計信息或處理任何GUI。將代碼掛鉤到WCF實例中的正確方法?
目前我正在努力使WCF服務內部有多個事件,這將允許表單添加偵聽器,以便它可以生成其統計信息。這是實現我的目標的正確方法,還是有更多的WCF特定機制?
我有一個WCF服務啓動並運行。我有它在一個勝利形式的應用程序託管,我想有各種統計數據關於它的使用情況實時顯示在窗體上。顯然,我不希望WCF服務中的任何代碼收集統計信息或處理任何GUI。將代碼掛鉤到WCF實例中的正確方法?
目前我正在努力使WCF服務內部有多個事件,這將允許表單添加偵聽器,以便它可以生成其統計信息。這是實現我的目標的正確方法,還是有更多的WCF特定機制?
如前所述,靜態計數器或事件和聽衆可能會在技術上做到這一點,但如果您打算使用更通用的解決方案,則可以使用依賴注入(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容器,您可能可以使用其攔截功能而不是手動滾動裝飾器,但概念是相同的。
'標準'的方法是使用性能計數器,但是如果你(只/)只想報告給託管進程有點矯枉過正。
你可以使用events + listeners,對我來說似乎很好。
或者使用簡單的靜態計數器和Interlocked.Increment(),這將是最快的方法。
WCF還提供了開發自定義行爲的功能,允許您檢查和擴展服務方法調用的各個方面。例如,存在可定製的行爲來檢查方法參數,檢查消息內容並控制操作的調用方式。 This MSDN雜誌文章很好地概述了自定義行爲。
我不確定你的儀器需求是什麼,所以我不能確定這是否適合你想要做的事情。恕我直言,事件+聽衆也是一個可行的解決方案。也許即使是這兩者的一些組合也許是你最好的選擇。