Я застрял в одной части использования 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-прокси для 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;}}
}
Большое спасибо за любые предложения!