2010-01-18 15 views
1

好吧...我有一個C#.dll是單例的情況。現在,我想要做的就是當singletonInstance被實例化時,能夠提供對任何可能啓動的其他應用程序的引用。所以,我查了一下NamedPipes,這個工作將會奏效 - 除了一件事,它必須是跨平臺的,或者是平臺獨立的。我有一個解決方案,但我很難找出是否可以通過句柄或其他方法派生對singletonInstance的引用?Singleton引用

既然已經有了一些評論和問題,我可以多解釋一點,並澄清一下:我擁有的基本上是共享資源(我的singletonInstance.dll)。說appA需要那個singletonInstance,如果它還沒有實例化,它會實例化它。然後,appB啓動,它需要對singletonInstance的引用。這是場景。

+1

您正在使用.NET。爲了您的目的,框架提供的任何東西都是跨平臺的。 – 2010-01-18 20:36:08

+2

我想知道*爲什麼*你想這樣做。 – 2010-01-18 20:53:50

+0

名稱「singletonInstance」對我來說是一種代碼味道。 – Tom 2010-01-18 21:13:26

回答

2

如果我正確地閱讀這篇文章,您應該管理服務器上的實例,並讓其他應用程序與服務器對話而不是對象本身。 Web服務是首先想到的,但我不太瞭解您的問題。

+0

我以爲Remoting(見下面的答案)就是答案。但這真的是最好的開始。我們正在考慮我們的選擇,包括Tcp套接字和實施protobuf網。 – IAbstract 2010-01-25 08:59:05

0

那麼,你可以通過命名管道溝通,當他們不可用時,你可以去套接字,但這取決於你的「單身人士」將要做什麼。它是某種共享緩存嗎?或者是什麼?

將單獨的應用程序和「singleton」在同一臺機器上還是在網絡上運行?反正套接字的方法是好的,如果你想控制低級別的實現,或者你可以去一些開銷或使用遠程Web服務。

+0

我現在使用的是使用進程/應用程序域來「查找」.dll的實例,然後MarshalByRefObject - 通過InstanceAndUnwrap()函數獲取我的引用。我們會看看它是如何發展的。 – IAbstract 2010-01-20 01:20:35

0

我會提供一個答案 - Runtime.Remoting.Channels。我有一個公共數據對象('singletonInstance')繼承MarshaByRefObject。這給了我們正是我們想要的東西,再加上我們正在使它具備一些網絡功能。現在,這真像一項服務。 TcpChannel'Server'實際上是公用數據對象所在的.dll的一部分。這主要僅用於測試,實驗實施等。

0

這聽起來像你最好實施任何需要共享的服務。

您可以通過多種方式連接到您選擇公開/實施/允許的服務。 Web服務,WCF,命名管道或原始套接字等。選擇最適合您的任何內容。

服務本身可以適當地管理它的內部狀態(單例反模式或其他方式,它是無關緊要的)。

想想如何構建Sql Server。它不是跨進程和內存邊界共享相同的dll實例,也不是使用沉重的客戶端。

+0

@Robert:對... CommonDataObject確實設置了一個'公共'實例,其中用戶擁有單獨的應用程序工作區,甚至是用於協作工作的工作組工作區。這也是嘗試創建一個獨立於平臺的解決方案,併爲我們提供實現自定義安全功能的能力。 – IAbstract 2010-01-22 01:08:26