如何避免在WCF客户端中生成的自定义类型名称冲突

时间:2011-08-08 11:46:39

标签: wcf web-services

自定义类型(例如Engine)在WCF服务器端的两个不同的命名空间中定义,它作为Engine,Engine1公开给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以发生所有事件)。使用类继承解决它也很繁琐。可以定义两个具有相同名称的自定义类型,这可能需要更少的工作。

任何想法都会非常感激!

修改 * 可能的解决方案 *

将其放入单独的界面,如下所示

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


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

这会将相同的自定义类型放在客户端的不同命名空间中。

2 个答案:

答案 0 :(得分:1)

如果您的Engine代表相同的概念,则可以在专用命名空间中定义一个Engine,并从WcfServiceLibrary1.MC和{{1}引用它}。

然而,您的示例建议您应将车辆收集到单个命名空间中并使用继承。

WcfServiceLibrary1.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; } } } 财产。

答案 1 :(得分:0)

首先,尝试在服务器和客户端之间共享代码库。 This link将告诉您如何为Silverlight执行此操作,如果您不使用Silverlight,请检查this SO search link以查找有关此主题的各种帖子和答案。

其次,如果您无法共享库,那么编辑生成的客户端类文件将起作用(只需删除Engine1的定义并修复对它的任何引用以指向Engine),尽管如果重新生成代理,您将丢失更改。