2011-08-08 4 views
0

사용자 유형 (예 : 엔진)은 WCF 서버 측의 서로 다른 두 개의 네임 스페이스에 정의되어 있으며 Engine, Engine1로 WCF 클라이언트에 노출되어 있습니다. 노출 된 유형이 동일한 이름 (이 경우 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 모두 같은이 사용자 지정 형식의 큰 숫자를 포함하고 있습니다 :

다음
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 클라이언트입니다 : 아래

내 예제 코드입니다 이름이지만 다른 기능. 따라서 클라이언트 측에서 이름을 변경하는 것은 지루합니다 (예 : 모든 발생에 대해 Engine1을 Engine으로 변경). 또한 클래스 상속을 사용하여 문제를 해결하는 것이 지루합니다. 이름이 같은 두 개의 사용자 정의 유형을 정의하면 작업이 덜 필요할 수도 있습니다.

어떤 아이디어라도 대단히 감사하겠습니다.

[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를 가리 키도록에 대한 참조를 수정) 당신이 경우 변경 내용을 잃게됩니다 있지만, 프록시를 다시 생성하십시오. 당신의 Engine의이 동일한 개념을 나타내는 경우

+0

slugster, thanks. 감사합니다. 많은 수의 클래스로 인해이 옵션은 최후의 수단이 될 수 있습니다. – Pingpong

+0

@slugster 클라이언트 측에서 생성 된 코드를 수정하여 리팩토링이 필요한 디자인으로 인한 문제를 해결하는 것은 매우 위험한 것 같습니다. – Filburt

1

, 당신은 전용 네임 스페이스에 하나 Engine을 정의하고 WcfServiceLibrary1.MCWcfServiceLibrary1.C에서 참조 할 수있다.

그러나 예제에서는 차량을 하나의 네임 스페이스에 모으고 상속을 사용해야한다고 제안합니다.

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, 귀하의 조언에 감사드립니다. 다른 유형의 기능이 동일한 유형에 할당되기 때문에 사용자 정의 유형 (예 : 엔진) 공유 아이디어가 적합하지 않습니다. 예 : 엔진 유형은 완전히 다른 기능을합니다. – Pingpong

관련 문제