Информация об изменениях

Сообщение Re[4]: DDD: разные коллекции внутри и снаружи агрегата от 17.06.2024 8:11

Изменено 17.06.2024 8:16 zelenprog

Re[4]: DDD: разные коллекции внутри и снаружи агрегата
F>1. Сделать и использовать свои интерфейсы для таких коллекций.

Тогда вопрос: как реализовать такие коллекции?
Дело в том, что в моей среде один и тот же объект может быть преобразован к двум разным интерфейсам, но возможно и обратное преобразование.
То есть, возможна такая ситуация:
— создаем класс "T_MyCollection", который реализует и "IEditableCollection" и "IReadOnlyCollection"
— внутри агрегата создаем объект этого класса
— работаем внутри агрегата с этим объектом через интерфейс IEditableCollection
— через свойство "выставляем" этот объект как интерфейс IReadOnlyCollection
— клиент, получив объект, может преобразовать его в "исходный" тип T_MyCollection и изменить коллекцию

Значит, чтобы клиент не мог извне менять коллекцию мне нужно создать два отдельных класса:
— class T_MyEditableCollection : IEditableCollection
— class T_MyReadOnlyCollection : IReadOnlyCollection
Верно?

Тогда сценарий будет такой:
— при чтении данных создаем объект класса T_MyEditableCollection (lAnalogs_MyEditableCollection = new T_MyEditableCollection) и заполняем его нужными элементами
— при создании агрегата передаем ему через конструктор объект lAnalogs_MyEditableCollection
— внутри агрегата создаем объект класса T_MyReadOnlyCollection: lAnalogs_MyReadOnlyCollection = new T_MyReadOnlyCollection
— данные из lAnalogs_MyEditableCollection передаем в объект lAnalogs_MyReadOnlyCollection
— через свойство агрегата возвращаем ссылку на lAnalogs_MyReadOnlyCollection

Вопрос: как передать данные из lAnalogs_MyEditableCollection в объект lAnalogs_MyReadOnlyCollection?
Перекачивать каждый элемент коллекции — неправильно — это лишнее.
Значит, эти два объекта должны каким-то образом "разделять" общий список элементов.
А как это делается?
Re[4]: DDD: разные коллекции внутри и снаружи агрегата
F>1. Сделать и использовать свои интерфейсы для таких коллекций.

Тогда вопрос: как реализовать такие коллекции?
Дело в том, что в моей среде один и тот же объект может быть преобразован к двум разным интерфейсам, но возможно и обратное преобразование.
То есть, возможна такая ситуация:
— создаем класс "T_MyCollection", который реализует и "IEditableCollection" и "IReadOnlyCollection"
— внутри агрегата создаем объект этого класса
— работаем внутри агрегата с этим объектом через интерфейс IEditableCollection
— через свойство "выставляем" этот объект как интерфейс IReadOnlyCollection
— клиент, получив объект, может преобразовать его в "исходный" тип T_MyCollection и изменить коллекцию

Значит, чтобы клиент не мог извне менять коллекцию мне нужно создать два отдельных класса:
— class T_MyEditableCollection : IEditableCollection
— class T_MyReadOnlyCollection : IReadOnlyCollection
Верно?

Предположим я сделал эти два класса, которые реализуют интерфейсы, и для реализации используют списки элементов.
Тогда сценарий работы с агрегатом будет такой:
— при чтении данных создаем объект класса T_MyEditableCollection (lAnalogs_MyEditableCollection = new T_MyEditableCollection) и заполняем его нужными элементами
— при создании агрегата передаем ему через конструктор объект lAnalogs_MyEditableCollection
— внутри агрегата создаем объект класса T_MyReadOnlyCollection: lAnalogs_MyReadOnlyCollection = new T_MyReadOnlyCollection
— данные из lAnalogs_MyEditableCollection передаем в объект lAnalogs_MyReadOnlyCollection
— через свойство агрегата возвращаем ссылку на lAnalogs_MyReadOnlyCollection

Вопрос: как передать данные (список элементов) из lAnalogs_MyEditableCollection в объект lAnalogs_MyReadOnlyCollection?
Перекачивать каждый элемент коллекции — неправильно — это лишнее.
Значит, эти два объекта должны каким-то образом "разделять" общий список элементов.
А как это правильно сделать?