我有這樣一個服務器端DataContract
:WCF DataContract等價混亂
[DataContract(Name = "CommonType", Namespace = "http://mycompany.com/2014/09/DataService")]
public class CompositeType
{
bool boolValue = true;
string stringValue = "Hello ";
[DataMember(Name="Property1")]
public bool BoolValue
{
get { return boolValue; }
set { boolValue = value; }
}
[DataMember(Name = "Property2")]
public string StringValue
{
get { return stringValue; }
set { stringValue = value; }
}
}
服務器端的類名是CompositeType
具有指定DataContract名稱和命名空間。
客戶端類看起來是這樣的:
[DataContract(Name = "CommonType", Namespace = "http://mycompany.com/2014/09/DataService")]
public class ClientType
{
bool boolValue;
string stringValue;
[DataMember(Name = "Property1")]
public bool ClientBoolValue
{
get { return boolValue; }
set { boolValue = value; }
}
[DataMember(Name = "Property2")]
public string ClientStringValue
{
get { return stringValue; }
set { stringValue = value; }
}
}
客戶端類是不同的類型,但相同的DataContract名稱和命名空間。
的的ServiceContract看起來是這樣的:
[ServiceContract]
public interface IService1
{
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
}
的實施過程是這樣:
public class Service1 : AES.Services.Data.IService1
{
public AES.Services.Data.CompositeType GetDataUsingDataContract(AES.Services.Data.CompositeType composite)
{
if (composite == null)
{
throw new ArgumentNullException("composite");
}
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
如何利用我的客戶端類型用於datacontract類型?客戶端爲服務生成代理,生成的類型是新類。我不應該使用DataContract名稱與服務器端DataContract匹配的客戶端類型嗎?
我期望能夠在客戶端執行此代碼,不是嗎?
Service.Service1Client client = new Service.Service1Client();
ClientType ct = new ClientType();
client.GetDataUsingDataContract(ct);
但上述代碼失敗,因爲我傳遞的參數不是通過服務引用生成生成的代理類。我想如何使用我的客戶端版本的數據合同?
UPDATE
我已經找到工作的解決方案是使用通道工廠,並創建自己的客戶端的ServiceContract和DataContract,起初我不喜歡它,但我意識到,這正是無論如何,ServiceReference正在做。我在客戶端和服務器上的ServiceContractAttribute和DataContractAttribute上放置了一個公用名稱和名稱空間。現在我可以獨立開發/進化我的課程。
此鏈路支持這種做法,以及:http://www.codeproject.com/Articles/55690/WCF-Loose-coupling-of-WCF-Service-and-Data-Contrac
我已經找到工作的解決方案是使用通道工廠,並創建自己的客戶端的ServiceContract和DataContract,起初我不喜歡它,但我意識到,這正是無論如何,ServiceReference正在做。我在客戶端和服務器上的ServiceContractAttribute和DataContractAttribute上放置了一個公用名稱和名稱空間。現在我可以獨立開發/進化我的課程。我認爲這是你建議的方法。 – 2014-09-19 12:51:00