2011-08-08 44 views
0

在WCF服務器端的兩個不同名稱空間中定義了自定義類型(例如Engine),該名稱空間作爲Engine,Engine1公開給WCF客戶端。如何設置,以便暴露的類型具有相同的名稱,在這種情況下引擎。如何避免在WCF客戶端中生成的自定義類型名稱衝突

下面是我的示例代碼:

namespace WcfServiceLibrary1 
{ 
    [ServiceContract] 
    interface ICar 
    { 
     [OperationContract] 
     void RepairMotorCycle(MotorCycle motorCycle); 

     [OperationContract] 
     void RepairTwoDoorCar(TwoDoorCar Car); 
    } 


    public class Car:ICar 
    { 

     public void RepairMotorCycle(MotorCycle motorCycle) 
     { 
      throw new NotImplementedException(); 
     } 

     public void RepairTwoDoorCar(TwoDoorCar Car) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

namespace WcfServiceLibrary1.MC 
{ 

    public class MotorCycle 
    { 
     public Engine Engine { get; set; } 
    } 

    public class Engine { } 

} 

namespace WcfServiceLibrary1.C 
{ 
    public class TwoDoorCar 
    { 
     public Engine Engine { get; set; } 
    } 

    public class Engine { } 
} 

下面是引擎WCF客戶端:

[System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")] 
    [System.Runtime.Serialization.DataContractAttribute(Name="Engine", Namespace="http://schemas.datacontract.org/2004/07/WcfServiceLibrary1.MC")] 
    [System.SerializableAttribute()] 
    public partial class Engine : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged { 

} 

[System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")] 
    [System.Runtime.Serialization.DataContractAttribute(Name="Engine", Namespace="http://schemas.datacontract.org/2004/07/WcfServiceLibrary1.C")] 
    [System.SerializableAttribute()] 
    public partial class Engine1 : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged { 

    } 

請注意,這兩個摩托車和TwoDoorCar含有大量的自定義類型的具有相同名字但功能不同。因此,在客戶端更改名稱非常繁瑣(例如,將Engine1更改爲所有發生的引擎)。使用類繼承來解決它也很繁瑣。可以定義兩個具有相同名稱的自定義類型,這可能需要較少的工作。

任何想法將非常感激!

編輯 * 可能的解決方案 *

把它放進單獨的界面,如下圖

[ServiceContract] 
     interface ICar1 
     { 
      [OperationContract] 
      void RepairMotorCycle(MotorCycle motorCycle); 
    } 


[ServiceContract] 
     interface ICar2 
     { 
      [OperationContract] 
      void RepairTwoDoorCar(TwoDoorCar Car); 
     } 

這將會把相同的自定義類型在不同的命名空間的客戶端。

回答

0

首先,嘗試在服務器和客戶端之間共享您的代碼庫。 This link會告訴你如何爲Silverlight做到這一點,如果你不使用Silverlight,然後檢查this SO search link各種帖子和主題的答案。其次,如果你不能共享這些庫,那麼編輯生成的客戶端類文件將會起作用(只是刪除Engine1的定義並修正它的任何引用以指向Engine),但是如果你重新生成代理。

+0

slugster,謝謝。由於課程數量衆多,這個選項可能是最後的解決方案 – Pingpong

+0

@slugster修復因嚴重需要在客戶端修改生成的代碼而需要重構的設計導致的問題,這對我來說似乎非常危險。 – Filburt

1

如果您Engine s爲同一概念,你可以一個專門的命名空間中定義一個EngineWcfServiceLibrary1.MCWcfServiceLibrary1.C引用它。

但是,您的示例表明,您應該將您的車輛收集到一個名稱空間中並利用繼承。

namespace WcfServiceLibrary.Vehicles 
{ 
    public class Engine 
    { 
    } 

    public abstract class Vehicle 
    { 
     public Engine { get; set; } 
    } 

    public class Car : Vehicle 
    { 
    } 

    pulic class Motorcycle : Vehicle 
    { 
    } 
} 

移動你Engine一個共同的命名空間看起來是這樣的:

namespace WcfServiceLibrary.Common 
{ 
    public class Engine 
    { 
    } 
} 

你的 「摩托車」 庫

using WcfServiceLibrary.Common 

namespace WcfServiceLibrary.MC 
{ 
    public class Motorcycle 
    { 
     public Engine Engine { get; set; } 
    } 
} 

...和你的 「汽車」 庫

using WcfServiceLibrary.Common 

namespace WcfServiceLibrary.C 
{ 
    public class Car 
    { 
     public Engine Engine { get; set; } 
    } 
} 

您不必更改您的Engine屬性。

+0

謝謝!由於目前的實施,這個選項是不可能的。 – Pingpong

+0

即使將'Engine'移動到引用的命名空間? – Filburt

+0

Filburt,謝謝你的建議。共享自定義類型(例如引擎)的想法是不合適的,因爲不同的功能將被分配到相同的類型。例如引擎類型具有完全不同的功能。 – Pingpong

相關問題