2011-05-17 101 views
6

我有這個類:彙總接口

class UrlManagementServiceClient : System.ServiceModel.ClientBase<IUrlManagementService>, IUrlManagementService 

ClientBase實現IDisposableICommunicationObject。我也有這個接口:

interface IUrlManagementProxy : IUrlManagementService, ICommunicationObject, IDisposable 

但我不能投UrlManagementServiceClient對象IUrlManagementProxy。有什麼辦法可以做到這一點?我想結束一個可以訪問所有三個接口上的所有方法的對象。

回答

4

您只能投射到您繼承的接口,以便能夠投射到IUrlManagementProxy您需要實現該接口。

class UrlManagementServiceClient : 
    System.ServiceModel.ClientBase<IUrlManagementService>, IUrlManagementProxy 

你可以再投UrlManagementServiceClient要麼UrlManagementProxyIUrlManagementServiceICommunicationObjectIDisposable

編輯
的WCF生成的類是局部的,即意味着可以在另一文件擴展的類定義。把

public partial class UrlManagementServiceClient : IUrlManagementProxy {} 

在另一個代碼文件和你的類太實現完整IUrlManagementProxy接口,然後你可以將其轉換爲IUrlManagementProxy

+0

UrlManagementServiceClient是一個自動生成的WCF客戶端。如果需要重新生成文件,我想避免對文件進行手動編輯。 – RandomEngy 2011-05-17 19:56:13

+0

@RandomEngy,你可以在一個單獨的文件中添加一個帶有你自己界面的分類定義,參見我的答案編輯。 – 2011-05-18 15:24:22

+0

不錯。清潔和簡單。 – RandomEngy 2011-05-18 15:43:38

1

製作UrlManagementServiceClient實施IUrlManagementProxy代替IUrlManagementService

class UrlManagementServiceClient : System.ServiceModel.ClientBase<IUrlManagementProxy>, IUrlManagementProxy 
0

您需要在UrlManagementServiceClient實施IUrlManagementProxy。沒有其他辦法 - 這是一個單獨的類型。

0

你顯然不能將一個對象轉換爲它沒有實現的接口。

但是,你可以做什麼(如果是有意義的實現爲每個接口出UrlManagementServiceClient實例的所有方法),是包裝UrlManagementServiceClient中實現你所需要的接口的對象。我們稱之爲Decorator pattern(而不是代理)。代理通常「出現」作爲底層對象,而在這種情況下,您正在添加客戶端不具備的功能。

換句話說,你需要一個新的類:

public class UrlManagementClientProxy : IUrlManagementProxy 
{ 
    // we need a reference to the underlying client 
    private readonly UrlManagementServiceClient _client; 

    // underlying client is passed to the proxy in constructor 
    public UrlManagementClientProxy(UrlManagementServiceClient client) 
    { 
     _client = client; 
    } 

    #region IUrlManagementProxy methods 

    // you implementation goes here. if the underlying client 
    // already implements a certain method, then you just need 
    // to pass the call 

    // for example, client already implements methods 
    // from the IUrlManagementService interface, so use them 

    public string GetUrl() // made up 
    { 
      return _client.GetUrl(); 
    } 

    #endregion 
} 

這允許您重用客戶實施,並且在它的上面添加額外的功能。

+0

試過這個,但是有很多東西要在ICommunicationObject和IUrlManagementService上實現,並且變得混亂。我採用另一種方法。 – RandomEngy 2011-05-17 20:34:58

0

爲了解決這個問題,我只是擴展了類,並宣佈它的聚合接口:

public class UrlManagementProxy : UrlManagementServiceClient, IUrlManagementProxy 
{ 
    public UrlManagementProxy(Binding binding, EndpointAddress remoteAddress) 
     : base(binding, remoteAddress) 
    { 
    } 
} 

然後我用UrlManagementProxy代替UrlManagementServiceClient

我只需要通過我需要的構造函數。其餘的都是自動處理的。也是這樣,我不需要修改UrlManagementServiceClient,所以我可以重新生成它,一切仍然會工作。