NHibernate переопределяет сопоставленные сеттеры? - PullRequest
2 голосов
/ 05 апреля 2011

Я хотел бы сделать это в сопоставленном объекте NHibernate:

    private ShiftTradeOffer m_Offer;

    public virtual ShiftTradeOffer Offer{ 
        get {
            return m_Offer;
        }
        set {

            //... Do some stuff ...

            if (condition)
            {
                m_Offer = value;
            } else {
                throw new Exception("whoops!");
            }

        }
    }

(ShiftTradeOffer является сопоставленным свойством)

1) Это создаст проблему?

2) Этот сеттер вызывается при создании объекта?

3) Это противоречит передовой практике с точки зрения обеспечения проверки? Я хотел бы, чтобы в этот класс было встроено поведение, специфичное для объекта.

1 Ответ

3 голосов
/ 05 апреля 2011

1) Свойства по определению не должны вызывать исключения. Ваш подход нарушает эту лучшую практику.

2) Исходный установщик вызывается, потому что NHibernate просто создает прокси, который вызывает базовый получатель / установщик. Мы используем свойства, содержащие логику сериализации, для сопоставления сериализованных данных, которые иначе не будут работать.

Пример:

public virtual List<Foo> Foos {get;set;}
public virtual string SerializedFoos 
{
    get { return JsonConvert.Serialize(Foos); }
    set { Foos = JsonConvert.Deserialize<List<Foo>>(value); }
}

Отображается только свойство SerializedFoos, а код домена работает со свойствами Foos. Поэтому NHibernate записывает хороший JSON в базу данных, в то время как домен может работать с удобным списком без потери производительности, потому что (де) сериализация происходит только тогда, когда объект загружен / сохранен.

3) Существует множество методов проверки, некоторые предпочитают атрибуты, некоторые предпочитают класс проверки для каждого объекта домена.

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

Одним из поисковых терминов для пути атрибута является «аннотации данных». Google поднял этот результат, например: http://stephenwalther.com/blog/archive/2008/09/10/asp-net-mvc-tip-43-use-data-annotation-validators.aspx

Если вы выполняете привязку данных, вы можете взглянуть на интерфейс IDataErrorInfo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...