2012-08-28 43 views
2

我在C#中編寫了兩個需要能夠通信的應用程序(僅在一個方向上)。這兩個應用程序將始終在同一臺機器上運行,因此將WCF與命名管道一起使用,並自行託管WCF服務似乎是合乎邏輯的選擇。實例化服務器上​​的WCF服務對象,而不是客戶端?

據我所知,我可以使用InstanceContextMode來配置服務實例是每個會話,每次調用實例化的,還是應該只有一個實例。在我的情況下,我想要一個實例,因爲我將只運行兩個應用程序,所以會有一個客戶端和一個服務器。

但這裏是我卡住的地方。當我的客戶端發出的服務,這是我正在做這樣一個電話:

var myServiceFactory = new ChannelFactory<IMyService>(
    new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/MyService")); 

IMyService myService = myServiceFactory.CreateChannel(); 
myService.DoStuff(); 

我不希望在服務器上創建一個新的服務器對象實例。相反,我希望myService指向服務器上已經創建了(已唯一)IMyService實例。目前,構建第二個IMyService實例。

換句話說,我希望我的服務器對象由服務器構建(服務器啓動時),而不是客戶端首次撥打電話時。

任何人都可以解釋如何做到這一點?據我所知,.NET Remoting使得這很容易,WCF已經取代了Remoting,所以必須有一個簡單的方法......對吧?

回答

3

WCF的ServiceHost有一個構造函數,該構造函數完全用於服務類的單例實例,而不是服務類型。如果在服務主機中使用此構造函數,則必須將InstanceContextMode設置爲Singleton。

請注意,在您引用的客戶端代碼中,IMyService myService不是您所稱的「服務器對象」......它是客戶端代理,WCF通過該代理將消息從客戶端路由到實際服務。

+0

我完全錯過了ServiceHost的構造函數,謝謝。 (是的,我可能會更仔細地解釋我指的是「指向」IMyService實例的含義。) – Justin