Я застрял в одной части использования 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 я создаю прокси WCF для a ServiceContract и DataContracts (кстати: нет ссылки на общий файл App.Contracts.dll, в который я мог бы поместить определенные выше DataContracts), для транспортировки данные от клиента к серверу у меня теперь все настроено ...
Но с точки зрения пользовательской функциональности на стороне клиента еще есть пути.
Я хочу убедиться, что пользователи могут работать с вышеуказанными свойствами, но с некоторой проверкой типов, выполняемой при создании экземпляров клиентских объектов.
Например, я хотел бы, чтобы фактический класс, с которым работают пользователи, выглядел больше как:
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;}}
}
Большое спасибо за любые предложения!