NHibernate - почему этот статический метод допустим в этом доменном классе? - PullRequest
1 голос
/ 17 ноября 2009

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

Однако, хотя ошибка времени выполнения генерируется для любых свойств, которые не помечены как виртуальные, Я обнаружил, что статические методы разрешены и не генерируют ошибку времени выполнения . Поскольку они статичны, они, конечно, не помечены как виртуальные, что нарушает правило в пункте 4.1.4 документации (см. Выше). Я проверил полученный sql, и он также корректно выполняет отложенную загрузку, когда я запускаю тест по методу, поэтому можно ли использовать статические методы?

Вот основные детали персистентного класса:

public class CmsPage
{
    public virtual int? Id { get; set; }
    public virtual string Title { get; set; }

    public virtual void Update()
    {
        using (ISession session = NHibernateHelper.OpenSession())
        {
            using (ITransaction transaction = session.BeginTransaction())
            {
                session.Update(this);
                transaction.Commit();
            }
        }
    }

    // Note: static and non-virtual and yet it will not cause a problem for Nhibernate
    public static IEnumerable<CmsPage> GetList()
    {
        IList<CmsPage> pageList;
        using (ISession session = NHibernateHelper.OpenSession())
        {
            string hql = "from CmsPage p";
            pageList = session.CreateQuery(hql)
                .List<CmsPage>();
        }

        return pageList;
    }
}

Итак, мой вопрос: почему нормально использовать статический метод в классе персистентного домена, когда документация говорит, что это не так?

Пожалуйста, ответьте с точки зрения NHibernate, а не с точки зрения дизайна ОО; Я не хочу вступать в дебаты по OOD / OOP, если этого можно избежать, пожалуйста.

Ответы [ 3 ]

1 голос
/ 17 ноября 2009

Документация гласит: «NHibernate работает лучше всего , если эти классы следуют некоторым простым правилам, ...» Он не говорит, что он не будет работать (очевидно, он работает).

Так что, на самом деле, обсуждение сводится к проблеме ОО.

0 голосов
/ 17 ноября 2009

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

class Foo {
    public virtual Foo[] Neighbors { get; set; }
}

NHibernate тайно генерирует такие классы, как:

class NHProxy03450843275 : Foo {
    public virtual Foo[] Neighbors { /* Godawful lazy-loading magic goes here */ }
}

На самом деле это хуже, чем это, но это дает вам идею. В любом случае, статические методы не привязаны к конкретным экземплярам класса, поэтому NH не нуждается в прокси, чтобы иметь с ними дело. Таким образом, они могут быть не виртуальными.

0 голосов
/ 17 ноября 2009

На самом деле это относится только к свойствам. Методы не сохраняются, поэтому proxies и lazy-loading не применяются. В идеале вы должны отделить доступ к данным (статические методы в вашем случае) от объекта домена. Но вы правильно указали на это, возможно, документация должна была быть более ясной.

В заключение ваш класс в порядке, но может быть даже лучше, если вы разделите проблемы.

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