2011-08-08 3 views
0

カスタムタイプ(エンジンなど)は、Engine1としてWCFクライアントに公開されているWCFサーバー側の2つの異なる名前空間で定義されています。公開されているタイプの名前が同じになるように設定するには、この場合Engineを選択します。以下は回避方法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 { } 
} 

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 { 

    } 

はMOTOCYCLEとTwoDoorCarの両方が同じを持つカスタムタイプが多数含まれていることに注意してください名前は異なるが機能は異なる。したがって、クライアント側で名前を変更するのは面倒です(たとえば、すべての発生時にEngine1をEngineに変更するなど)。また、クラスの継承を使用して解決するのは面倒です。同じ名前の2つのカスタムタイプを定義しても問題ありません。

どのようなアイデアをいただければ幸いです。

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


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

これ以下のように *

は別のインタフェースにそれを入れて

編集 * 可能な解決策は、クライアント側で異なる名前空間で同じカスタムタイプを配置します。

答えて

0

まず、サーバーとクライアントの間でコードライブラリを共有してみてください。 This linkは、Silverlightを使用していない場合は、this SO search linkをチェックして、その件に関するさまざまな投稿と回答を確認します。

第2に、ライブラリを共有できない場合、生成されたクライアントクラスファイルを編集することができます(の定義を削除し、Engineを指すように参照を修正します)。プロキシを再生成する。あなたのEngine sが同じ概念を表す場合

+0

slugster、ありがとう。クラスの数が多いため、このオプションが最後の手段になる可能性があります。 – Pingpong

+0

@slugsterクライアント側で生成されたコードを変更してリファクタリングを真剣に必要とする設計から生じる問題を修正することは非常に危険です。 – Filburt

1

、あなたは専用の名前空間に1 Engineを定義し、WcfServiceLibrary1.MCWcfServiceLibrary1.Cからそれを参照することができます。

あなたの例では、あなたの車を1つの名前空間に集めて継承を利用すべきであると示唆しています。

namespace WcfServiceLibrary.Common 
{ 
    public class Engine 
    { 
    } 
} 

あなたの "モーターサイクル" ライブラリ

using WcfServiceLibrary.Common 

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

...そして、あなたの "車" ライブラリ:

namespace WcfServiceLibrary.Vehicles 
{ 
    public class Engine 
    { 
    } 

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

    public class Car : Vehicle 
    { 
    } 

    pulic class Motorcycle : Vehicle 
    { 
    } 
} 

次のようになりますあなたのEngine共通の名前空間への移行

using WcfServiceLibrary.Common 

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

Engineプロパティを変更する必要はありません。

+0

ありがとう!現在の実装のため、このオプションは不可能です。 – Pingpong

+0

参照された名前空間に 'Engine'を移動さえしますか? – Filburt

+0

Filburt、あなたの助言に感謝します。異なるタイプの機能が同じタイプに割り当てられるため、カスタムタイプ(Engineなど)を共有するという考えは適切ではありません。例えばエンジンタイプは全く異なる機能を持っています。 – Pingpong

関連する問題