2011-07-19 75 views
0

有沒有辦法在客戶端的數據合同實體下使用基類?在生成的代碼中,它明確地從對象繼承。我有一個基礎類,我在我的應用程序體系結構中使用,以執行交叉任務。我想通過使他們的部分類來將我現有的業務對象集成到WCF服務中。除了我似乎無法使用我想要的基類之外,它的工作非常好。有沒有辦法在WCF的DataContract實體上使用自定義基類?

回答

0

您還有其他幾個選項可以將功能添加到客戶端的類中。使用哪一個取決於你正在尋找的用例。

如果您只想將新方法添加到該類的客戶端版本中,則可以使用部分類直接向生成的類添加新方法。

如果你想在客戶端有幾個對象共享一組方法以便它們可以多態訪問,那麼你可以使用partial類向定義新方法的類添加一個接口,創建一個幫助類提供方法定義,然後委託給實現接口的每個DataContract對象中的助手類。

public interface IDoStuff 
{ 
    void DoStuff() 
} 

public interface IDoStuffContext 
{ 
    int Data {get;} 
    string Value {set;} 
} 

public class DoStuffHelper 
{ 
    private IDoStuffContext _wrapped; 
    public DoStuffHelper(IDoStuffContext wrapped) 
    { 
    _wrapped = wrapped; 
    } 

    public void DoStuff() { 
     if(_wrapped.Data == 10) { 
     _wrapped.Value = "Hello World"; 
     } 
    } 
} 

public partial class MyDataContract1 : IDoStuff 
{ 
    private DoStuffHelper _helper = new DoStuffHelper(this); 

    public void DoStuff() { 
    _helper.DoStuff(); 
    } 
} 

public partial class MyDataContract2 : IDoStuff 
{ 
    private DoStuffHelper _helper = new DoStuffHelper(this); 

    public void DoStuff() { 
    _helper.DoStuff(); 
    } 
} 
+0

是的,這些都是我的想法。主要是幫手模式。我可能最終會做這樣的事情。並非所有的交叉問題都可以通過這種方式進行建模,而不需要大量的代碼冗餘,例如'INotifyPropertyChanged'。我的基類爲此提供了支持;幸運的是,代碼生成的實體也爲此提供了支持,但其他事情可能會針對基類專門調用該調用。我真的很想知道爲什麼它明確設置像這樣。我希望AOP真的成爲一件事情。 :( – Jordan

+1

你是什麼意思「實際上成了一件事」。有很多框架支持.NET中的AOP:http://www.codeproject.com/KB/cs/AOP_Frameworks_Rating.aspx。屬性更改通知是一個主要AOP的用例 –

+0

是的,我知道,我希望看到一些與微軟開發環境相結合的東西,它非常流行,不是嗎?如果是這樣,我希望它不是。我也許我應該考慮在我的下一個項目中使用這些工具之一,這是一個基本決定,也是它在這個項目中的後期。 – Jordan

1

不,我不認爲這是可能的使用標準的代理生成器。 XSD代碼生成器不指定實際的基類,也不允許通過參數指定。

我相信你看到的輸出是由於CodeDom類用於做實際的代碼生成,它支持各種語言。看起來C#生成器在沒有類繼承的情況下,將其轉換爲Object的顯式繼承。這是不幸的,因爲如果它不這樣做,你可以使用部分類來做你正在尋找的東西。

我相信最簡單的解決方案是使用搜索和替換,或者在更新服務引用後編寫一個宏來執行此操作。

+0

這很煩人。我想知道這個明確的聲明是否有理由。我只需要改變我包含交叉功能的方式(也許是AOP - 開玩笑)。此外,它改變生成的代碼的不良形式。無論如何,我從來不會這樣做。 – Jordan

+1

我相信這是CodeDom的一個特性,它不會爲它支持的每種語言提供完整的映射,並且傾向於在翻譯中丟失一些東西。完全同意重新生成代碼的修改。 –

0

在您的應用程序中創建服務上的基類,在其定義上添加幾個known types並在客戶端部分實現擴展它有意義嗎?

相關問題