Что такое Лучшая практика управления / создания классов для клиентской (любой) и серверной части веб-сервиса (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, поэтому у меня возникает ошибка, поскольку служба прерывает этот запрос.

  1. Вопрос, что делать в этой ситуации?
  2. Вопрос: что является наилучшей практикой для обеспечения взаимодействия между 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();
    }
}

0 ответов

Другие вопросы по тегам