Это модель домена, но она также сопоставлена с некоторой таблицей в базе данных с помощью конфигурации сопоставления, выполненной FluentNHibernate.
Не думаю, что это хорошая идея.Вы пытаетесь сделать три (или, может быть, четыре) вещи в этом одном классе, который я бы держал отдельно.
Я рекомендую иметь DTO для NHibernate (возможно, называется CarDto
) и бизнес-модель (вероятно, называется Car
).Таким образом, CarDto
может измениться по причинам, связанным с базой данных (но не по причинам моделирования), а Car
может измениться по причинам моделирования (но не по причинам базы данных).Например, функциональное программирование должно иметь неизменную бизнес-модель, но NHibernate может потребовать, чтобы его DTO были изменяемыми.Если вы используете один и тот же тип для обеих целей, вы не сможете удовлетворить все ограничения проекта.
как мне отобразить свойство Sunroof, используя его вспомогательное поле, зная, что они не разделяют одно и то жетип возвращаемого значения?
Не думаю, что у вас должно быть свойство и вспомогательное поле с разными типами.С CarDto
используйте null
для представления отсутствия Window
.Затем при отображении из CarDto
в Car
отобразите null
в состояние None
(с помощью функции Optional
, которую вы используете в данный момент).Затем при отображении с Car
на CarDto
отобразите None
обратно на null
(с помощью метода IfNoneUnsafe
, который вы используете в настоящее время).
Ваш Car
класс
- - это DTO NHibernate,
- - ваша бизнес-модель,
- содержит отображение из DTO в бизнес-модель, а
- содержит отображение из бизнесамодель для DTO.
Это три или четыре вещи (в зависимости от того, считаете ли вы отображение как одно или два), которые я упомянул выше.
ДОБАВЛЕНО2019-02-20
[ваш ответ] не решение моей проблемы, а предложение по улучшению архитектуры
Это и то и другое.
Я полностью согласен с тем, что вы сказали, и я был бы очень рад сделать это, но я не могу.В моей кодовой базе у меня более 250 классов моделей, которые довольно плохо спроектированы и имеют много ошибочно сделанных зависимостей.Я не могу позволить себе все это сразу рефакторировать.
Я не предлагаю вам изменить все сразу.Отнюдь не.В стиле Refactoring от Martin Fowler, я рекомендую вносить много небольших изменений со временем.
Например, насколько трудно будет изменить Car
на
public class Car
{
Option<Window> Sunroof
{
get => Optional(SunroofBacking);
set => SunroofBacking = value.IfNoneUnsafe((Window) null);
}
Window SunroofBacking { get; set; }
}
и использовать («лучше» названное) свойство Sunroof
для целей бизнес-логики и использовать SunroofBacking
для NHibernate
причин?