Дизайн класса SOA WCF для коллекций объектов или ситуаций типа "has-a" - PullRequest
2 голосов
/ 01 июля 2010

Мы разрабатываем объектную модель с нуля для приложения, которое будет предоставлять данные через WCF.Нам интересно, как справиться со случаем, когда объекты имеют коллекцию объектов внутри них.Например, контактный объект с коллекцией адресных объектов.

contact - list<address> 

Если у нас есть объект-обертка, что-то вроде "AddressCollection", у которого есть свои собственные свойства, такие как "hascollectionloaded", для отложенной загрузкиколлекция и другие вещи, о которых мы еще не думали, или мы должны просто положиться на список <>, как указано выше?

contact - AddressCollection - list<address>
                            - hasBeenFullyLoaded
                            - preferredObjectLoaded
                            - somethingElsePertinent

Для примера выше, мы могли бы позволить AddressCollection наследоваться от абстрактногобазовый класс или интерфейс, реализующий свойства hasbeenloaded и SomeElsePertinent?

ИЛИ даже реализовать другое свойство bool для самого объекта контакта "hasaddressloaded".

contact - list<address>
        - hasaddresscollectionloaded

Аналогично, какреализовать пользовательский объект в Контакте, который не обязательно является коллекцией?Например:

Contact - Status

ИЛИ

Contact - StatusObject - Status
                       - hasStatusLoaded
                       - somethingElseWeWantToKnow

1 Ответ

2 голосов
/ 06 июля 2010

Ваш вопрос немного двусмысленный, но я попробую.Надеюсь, мы сможем получить ответ с некоторыми ответами.

Прежде всего, не имеет значения, как вы возвращаете свои коллекции с помощью WCF.DataContractSerializer будет правильно сериализовать их на проводе.Для клиентов .Net они могут поддерживать оригинальные типы коллекций.Другие подписчики (например, Java) получат массив.

Моими первыми предложениями будут:

A) Используйте контракт First Development для создания ваших сообщений.Ваш сервис должен быть автономным и предоставлять отдельный запрос и ответ на каждый звонок.Это даст большую гибкость позже и также приведет к лучшему дизайну.

B) Вы действительно не должны открывать List для внешнего мира, вместо этого выставляйте Collection или ReadOnlyCollection.

Надеюсь, это укажет вам правильное направление.Если нет, возможно, мы сможем выяснить, какова ваша конечная цель, и мы можем работать оттуда.

Пока это все, что я вижу из вашего вопроса:

[DataContract]
public class AddressResponse
{
    [DataMember]
    public Collection<Address> Addresses { get; set; }

    [DataMember]
    public string Status { get; set; }

}
...