我正在学习WCF,我今天面临的挑战之一就是实现这个设计:
[DataContract]
public class MyOwnFaultException : FaultException<MyResult>
{
public MyOwnFaultException(MyResult result) : base(result) {}
}
[DataContract]
public class MyResult
{
readonly DefinedResults dres;
public MyResult(DefinedResults res) {
dres = res;
}
[DataMember]
public DefinedResults DRes
{
get { return this.dres; }
//do not want to have the setter for this, but w.o it .net throws exception
}
}
[DataContract]
public enum DefinedResults
{
Success = 0,
Fail = 1,
}
服务
[OperationContract]
[FaultContract(typeof(MyOwnFaultException))]
void TestRemoteException();
所以,当我尝试创建对我的'错误'服务的引用时,我自然会得到“No Set For DRes member”异常,这是理解的。但是如何将readonly字段模式实现到用于结果指示符的值对象?
答案 0 :(得分:3)
这是因为服务共享模式和契约,而不是类。
话虽如此,你可以通过以下方式破解它:
[DataMember]
public DefinedResults DRes
{
get { return this.dres; }
private set { /* NOOP */ }
}
答案 1 :(得分:1)
使用WCF时没有值对象。通过操作接收和发送的所有对象必须是可序列化的 - 必须具有无参数构造函数(正如注释中的marc指出的那样,DataContractSerializer
不需要)并且所有序列化字段必须是可写的。如果要发送不可序列化的对象,可以实现IDataContractSurrogate或只实现自己的数据传输对象(DTO)。