DDD Одна Машина и разные модели

210
17 августа 2017, 19:50

Исходные условия: - У нас есть класс измерительного прибора (MeasureDevice). MeasureDevice является сущностью. - Есть различные типы моделей измерительного прибора. Каждая модель также является сущностью. Модели измерительных приборов могут различаться между собой набором параметров. - Есть приложение, в котором пользователь регистрирует измерительный прибор. При регистрации прибора указывается его модель. Мы помним, что модели могут отличаться между собой набором параметров.

Ситуация: Пользователь зарегистрировал измерительный прибор и некоторое время спустя понял, что ошибся с типом модели. Пользователь хочет поменять модель прибора на другую, в которой предусмотрен несколько иной набор параметров.

Вопрос: Как можно разрешить представленную ситуацию?

P. S. Если модели различаются между собой набором параметров, то, по идее, каждая из них представляет собой отдельный класс-сущность со своим набором свойств, правил валидации и т. д. Однако как быть с типом модели, которая должна храниться в классе MeasureDevice? Типы модели ведь могут быть разные.

Есть вариант хранить MeasureDeviceID, в котором представлена пара (ID, modelType). При этом modelType является перечислением (enum). Однако в таком случае необходимо будет постоянно корректировать enum. В целом такой подход вызывает у меня сильные сомнения.

Answer 1

Смотрите в сторону паттернов: Abstract Factory, Builder, Adapter. Вот источник https://metanit.com/sharp/patterns/ почитайте возможно найдет для себя подходящий

Answer 2

Заявляем, что MeasureDevice может менять тип в рамках собственных наследников. Условно, сущность умеет в ConvertTo<T>() или фабрика умеет в ConvertFrom<T>\CreateFrom<T>().

А дальше долго и уныло описываем все потенциальные конвертации. Например, если приборА был переделан в приборБ, то его собственное свойствоА должно быть присвоено(возможно с какими то изменениями) в свойствоБ прибораБ. Тут сильно помогают абстракции, т.е. изменения между двумя соседними приборами, у которых отличие в одном свойстве могут быть не описаны совсем, потому как нечего перетаскивать, а изменение из абсолютно несовместимых приборов - либо запрещены, либо будут равноценны фактически созданию новой сущности просто под старым идентификатором.

Что-то вида:

  if (source is entityA))
    Map(source.Properties.PropertyA, target.Properties.PropertyB);

Да, я сознательно не описываю жизнь системы с такими изменениями. Есть большая веротность, что где то была ссылка на приборА и после конвертации ссылка стала неподходящей в терминах предметной области, т.к. приборБ там никто не ждёт. Что с этим делать - нужно решать по конкретным кейсам, хороших советов нет.

Надо понимать, что не нужен универсальный механизм преобразования всего во всё. Обычно прикладные кейсы действительно простые, когда что-то очень похожее и их довольно просто друг в друга перегонять.

Answer 3

Создайте базовый тип ModelBase и наследуйте от него все модели, ссылку на ModelBase храните в MeasureDevice.

READ ALSO
Ошибка с неуправляемой памятью

Ошибка с неуправляемой памятью

Есть библиотека на c++ и документация к нейВ целом с ней могу работать, но с некоторыми функциями проблема

322
Преобразовать JSON строку в объект c# [дубликат]

Преобразовать JSON строку в объект c# [дубликат]

На данный вопрос уже ответили:

277
Как проверить e-mail c#?

Как проверить e-mail c#?

Можно ли отправить e-mail серверу проверочный запрос, что б подтвердить существование ящика? (Без авторизации)Поддерживают ли mail-сервера такую...

393
ORA-00936: missing expression

ORA-00936: missing expression

Когда я select делаю в Server я ловлю ошибку в catch ORA-00936: missing expression:

240