2014-02-17 63 views
1

如何在一個地方託管來自不同wcf庫的服務?許多WCF庫的WCF One ServiceHost

認爲我有2個WCF liberary dll文件,看起來像這樣

.DLLA

Public Class clientA : InterfaceA 

.DLLB

Public class clientB : InterfaceB 

兩個接口都有服務合同屬性和自身經營合同(S )。 兩個DLL文件我放在共享文件夾,這樣我可以動態加載他們,收留他們的服務

現在我想創建一個「AutoHosting」控制檯應用程序作爲中間層,但只使用一個單獨的ServiceHost主辦這兩個服務並使用相同的UriListen進行分配。

PS:我也希望解決方案儘可能靈活。例如,在未來我添加DLLC我希望ServiceHost能夠自動提取DLLC服務,而無需修改「AutoHosting」部分

請讓我知道最好的方法,如果你有。

+0

要做到這一點,兩個人中的一個需要做一些「額外的工作」。無論是DLL的創建者都需要編寫它,以便服務可以在app.config中沒有配置設置的情況下運行(無論是硬編碼值還是備用配置文件位置),或者DLL的用戶需要修改其配置文件DLL發佈的端點的設置。你想要做什麼,每個解決方案稍有不同。 –

+0

也有可能DLLA和DLLB都可以引用一個單獨的項目,它可以定義一個主要的「插件接口」,這個DLL需要在一個可以返回信息的類中實現,比如他們發佈的類和接口的名字該DLL。 –

+0

斯科特,謝謝你的迴應。但是沒關係,因爲有50多個DLL需要添加,所以如果額外的工作是必要的,我們會這樣做。我從網上找到的唯一解決方案是使用部分類,但我不想使用它,因爲每次我添加一些服務或接口時,我需要重新編譯我的dll – John

回答

0

根據你在你的問題的意見,我想我終於明白你的主要問題。

Scott,是的,我認爲這種方法,但當客戶端dll計數超過50+時,我將有example.org/MyServices/Client01 ... example.org/MyServices/Client50暴露。那麼你將罰款在app.config是可怕的,如果一個客戶想消費他們都

如果你想要一個主類,一切都可以通過一次談話(我並不是說這是一個好主意,我只想用巨大的客戶端app.config文件),您將需要動態生成一個將充當服務端點的類,實現所有定義的接口並將調用代理到DLL。

所以理論上大師班會看起來像

[ServiceContract] 
public interface IMasterInterface : InterfaceA, InterfaceB 
{ 
} 

public class MasterClass : IMasterInterface 
{ 
    public MasterClass() 
    { 
     aInstance = new DllA.clientA(); 
     bInstance = new DllB.clientB(); 
    } 

    DllA.InterfaceA aInstance; //Use full namespaces to prevent conflicts. 
    DllB.InterfaceB bInstance; 

    public void DllA.InterfaceA.Foo() //Use explicit interfaces to prevent name conflicts 
    { 
     aInstance.Foo(); 
    } 

    public bool DllB.InterfaceB.Foo() 
    { 
     return bInstance.Foo(); 
    } 
} 

現在對於不必每次添加或刪除一個DLL,事情是時間重新編譯程序的要求,你還是會做即,但不在開發時間

.NET提供的類允許您在運行時用CodeDOM即時生成程序集。每次程序啓動時(或至少每當您檢測到DLL中的更改時),您都需要重新創建MasterClassIMasterInterface類。只需枚舉這些DLL並構建您的單個主類和接口即可。

重要說明:我不知道這是否會在用新DLL添加或刪除重建時破壞與客戶端的合約。另外我不知道名稱衝突如何看待客戶端。我仍然建議你不要做這種做法,只是有一個大app.config而不是指向多個端點。如果您使用Visual Studio附帶的SvcConfigEditor.exe工具手動生成app.config,則可以通過重新使用多個類似服務之間的配置節來使其更小。