自定义类型(例如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);
}
这会将相同的自定义类型放在客户端的不同命名空间中。
答案 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
),尽管如果重新生成代理,您将丢失更改。