DDD. Фабрика в репозитории

221
09 февраля 2018, 17:36

Ситуация:

Есть игровой мониторинг.

Пользователь мониторинга может добавлять Сервер

И Пользователь и Сервер являются агрегатами. Сервер хранит идентификатор пользователя UserID, который его создал.

Новые сервера создаются при помощи фабричного метода RegisterServer, определенного в классе Пользователь. Конструктор Сервера не доступен (internal) за пределами сборки.

Вопрос:

Если конструктор Сервера не доступен за пределами сборки, то как тогда восстанавливать сущность Сервер в репозитории ServerRepository? В таком случае будет необходимо сначала создавать Пользователя внутри ServerRepository, чтобы потом при помощи фабричного метода RegisterServer восстанавливать объект-Сервер. А если необходимо вернуть полный список всех серверов?

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

UPD:

К сожалению, при составлении вопроса совсем забыл указать, что пишу на C#. Посчитал этот факт не важным в контексте вопроса.

Думаю, что я нашел решение своей проблемы. В репозитории ServerRepository достаточно будет использовать AutoMapper, который сможет восстановить объект на основе информации из базы данных. AutoMapper будет применяться исключительно в репозиториях. В самой доменной модели он не будет использоваться.

В таком случае в доменной модели можно будет сохранить жесткие правила регистрации новых игровых серверов.

Answer 1

Да, это черезмерное усложнение.

Архитектура должна контролировать сложность, а не создавать ее.

Объект Сервер не является реальным сервером реальному серверу. Это всего лишь абстракция для представления физического сервера в вашем коде.

RegisterServer - это регистрация нового, ранее неучтенного физического сервера в системе.

Странно позволять создавать новые объекты только путем регистрации реальных серверов. Это же практически означает, что вы вынуждены держать объект живым все время существования вашего физического сервера. Сомневаюсь, что ваше приложение сможет так долго работать без остановки :)

От того, что вы создадите объект, новый сервер в реальном мире не появится. Да, абстракции дырявая, можно создать объект сервер без пользователя - но это же ваш код. Просто не делайте так, всего делов.

READ ALSO
Навигация в Xamarin MvvMCross

Навигация в Xamarin MvvMCross

Есть две ViewModel, first и secondВ первой по ShowViewModel вызываем вторую

192
Непонятная ошибка в JS

Непонятная ошибка в JS

Консоль находит ошибку во второй функции при её вызове

182
var someArray = [“a”, “b”, “c”]; someArray.splice(someArray.length - 1, 1, “d”) //[“a”, “b”, “c”, “d”]

var someArray = [“a”, “b”, “c”]; someArray.splice(someArray.length - 1, 1, “d”) //[“a”, “b”, “c”, “d”]

Так почему же при someArray = ["a", "b", "c", "d"], someArraysplice(someArray

183
Проблема с калькуляторм

Проблема с калькуляторм

Помогите с решением, есть калькулятор, по клику на чекбокс #chek_plit отображается плита фундамента и форма ввода, надо сделать так чтобы при...

180