Что такое Лучшая практика управления / создания классов для клиентской (любой) и серверной части веб-сервиса (WCF)
Мне нужен совет:
Для разоблачения веб-сервиса я использую wcf basicHttpBinding.
1. Service has single instance mode and keeps List<ExtendedClientAction> in memory.
2. Service should recieve <ClientAction> and save it to that List<ExtendedClientAction>
3. Service should return List<ClientAction>, which is truncated list of ExtendedClientAction
Итак, я столкнулся с некоторыми проблемами: у класса ExtendedClientAction на стороне сервера есть конструктор и поля, которые имеют методы получения и установки. Я не уверен, что это хорошая практика для совместного использования типов, потому что он может иметь некоторую бизнес-логику, которая должна быть закрыта, и он может иметь гораздо больше полей, которые не должны быть доступны клиенту.
Вот почему я разделил его на два новых класса ClientAction для клиентских целей и наследуемый класс ExtendedClientAction. Класс ClientAction не имеет конструкторов, геттеров и сеттеров для полей, потому что они не могут перемещаться по проводам. И ExtendedClientAction имеет весь персонал.
Поэтому клиент отправляет в wcf сервис ClientAction, который оформляется и сохраняется на стороне сервера как ExtendedClientAction. Работает нормально.
Но когда я пытаюсь отправить обратно список ClientAction, я сталкиваюсь с проблемой, потому что мой список на самом деле относится к типу ExtendedClientAction, потому что я просто приводил List of ExtendedClientAction к Listof ClientAction. И так как я не хочу предоставлять ExtendedClientAction, я не украшаю его атрибутами DataContract, поэтому у меня возникает ошибка, поскольку служба прерывает этот запрос.
- Вопрос, что делать в этой ситуации?
Вопрос: что является наилучшей практикой для обеспечения взаимодействия между wcf и любыми другими клиентами при создании и совместном использовании классов?
//class for client purposes [DataContract(Namespace = "")] public class ClientAction { [DataMember] public DateTime StartTime; [DataMember] public DateTime EndTime; [DataMember] public string Name; [DataMember] public Guid Guid; [DataMember] public int Id; [DataMember] public Statuses Status; }
ниже класса для сервера
// class inherites ClienAction and is for server side purposes
public class ExtendedClientAction:ClientAction
{
private Guid _guid;
private Statuses _status;
private DateTime _endTime;
private DateTime _startTime;
public ExtendedClientAction()
{
_guid = Guid.NewGuid();
}
public Guid Guid
{
get
{
return _guid;
}
private set { var me= value; }
}
public DateTime EndTime
{
get { return _endTime; }
set
{
_endTime = value;
_status = Statuses.Finished;
}
}
public DateTime StartTime
{
get { return _startTime; }
set
{
_startTime = value;
_status = Statuses.Started;
}
}
public void Copy(ClientAction clientAction)
{
this.Name = clientAction.Name;
this.StartTime = clientAction.StartTime;
this.EndTime = clientAction.EndTime;
}
public string Comment;
}
Вот метод интерфейса и внедрения этого интерфейса:
[OperationContract(Name = "ReportForAllDates")]
List<ClientAction> ReportAll();
реализация:
public class TimeManagementService : ITimeManagement
{
private List<ExtendedClientAction> _myActionList;
public List<ClientAction> ReportAll()
{
return _myActionList.Cast<ClientAction>().ToList();
}
}