Вопрос

В настоящее время я пишу финансовое заявление, и у нас есть довольно стандартная таблица клиентов. Он состоит из множества обязательных полей и некоторых необязательных, таких как Cell / Fax и т. Д. Я использую NHibernate в качестве ORM и у меня все сопоставления правильные. Это уже работает.

Мне просто интересно, как я могу "выразить"? в коде, что поле не пусто без комментариев? У меня есть файлы hbm.xml, которые документируют это, но довольно неловко смотреть на них для таких вещей.

Еще одна вещь, которая приходит на ум, это то, что я не хочу, чтобы репозиторий генерировал исключения NHibernate в моей логике, поэтому, возможно, мне следует пройти путь проверки в контроллере. Тем не менее, как я могу сделать так, чтобы код POCO выражал, что некоторые поля могут быть нулевыми?

Диаграмма классов

Как видите, я хочу, чтобы сотовая связь и факс были необязательными, а телефон - обязательным. Все они являются просто составными сопоставлениями, поэтому файл сопоставления просто указывает, что отдельные элементы каждого из них должны быть ненулевыми, но я ненавижу постоянно проверять Person.Cellular! = Null, чтобы избежать исключения NullReferenceException.

Это было полезно?

Решение

Есть несколько способов сделать это в зависимости от вашего поведения POCO и стиля кодирования. Во-первых, вы можете использовать обнуляемые типы, чтобы выразить, что это поле является обнуляемым, и поэтому будет подразумеваться, что остальные не обнуляются. В качестве альтернативы вы могли бы ввести тип значения Phone в качестве типа для свойства Phone показанного вами POCO, подразумевая, что, поскольку он не является примитивным типом, он «более важен». - это также позволит вам инкапсулировать проверку номера телефона в самом классе.

По моему мнению, чтобы быть настоящим POCO-объектом, ему не нужно беспокоиться об основополагающей обнуляемости в таблице базы данных, в которой он хранится ... он должен фактически иметь типы проверки и значения, которые выражают его поведение как отдельную сущность ; таким образом, прежде чем он попадет в NHibernate, он уже находится в действительном состоянии.

Другие советы

Сделайте свойства notnull доступными только для чтения и запишите их через открытый конструктор. Сделать конструктор по умолчанию защищенным или закрытым.

public class DomainObject{
private string nnp;
protected DomainObject(){}
public DomainObject(string nnp){
this.nnp = nnp;
}
public string NotNullProp {get {return nnp;}}
public string NullableProp {get;set;} 
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top