我非常坚持将 WCF 用于客户端/服务器消息传递系统的一部分,非常感谢一些帮助。
在服务器上,我有一个 Message DataContract 对象,其中一个属性指向 MessageBody DataContracts 的类型化集合。该类的精简版本如下所示:
[DataContract]
class Message {
[DataMember]
string From;
[DataMember]
string To;
[DataMember]
string Subject{get;set;}
[DataMember]
MessageBodies {get;}
}
[DataContract]
class MessageBodies : CollectionBase<MessageBody>{}
[DataContract]
class MessageBody {
[DataMember]
BodyType Type get {get;set;}
[DataMember]
string Body {get;set;}
}
从 App.Client.dll,我创建了 ServiceContract 和 DataContracts 的 WCF 代理(顺便说一句:没有引用我可以放置上述定义的 DataContracts 的通用“App.Contracts.dll”),用于从客户端传输数据到服务器,我现在一切就绪......
但是从客户端的用户功能方面来看,还有很长的路要走。
我想确保用户可以使用上述属性,但在实例化客户端对象时会进行一些类型检查。例如,我希望用户使用的实际类看起来更像:
class MessageBody {
//ReadOnly only:
public BodyType Type get {get {return _Type;}}
private BodyType _Type;
//Validated property:
public string Body {
get{ return _Body;}
set{
if (value == null){throw new ArgumentNullException();}
_Body = value;
}
}
private string _Body;
//Set via Constructor only:
public MessageBody (BodyType type, string body){
//validate type and body first...
_Type = type;
_Body = body;
}
}
我试图用来解决这个问题的一个方向如下:
如果我将 DataContract 从 Message 重命名为 CommMessage,然后我可以用更智能的对象包装 POCO/WCF 对象......但是尽管这适用于大多数属性,但集合属性除外:
public Message {
CommMessage _InnerMessage;
public string Subject {get {_InnerMessage.Subject;}}
//Option 1: give direct access to inner object...but they are just poco's...
public CommMessageBodies MessageBodies { get {_InnerMessage.Addresses;}}
//Option 2...don't have one yet...what I would like is something like
//this (returning MessageBody rather than CommMessageBody):
//public MessageBodies MessageBodies {get {_InnerMessage.Bodies;}}
}
非常感谢任何和所有的建议!