Я прочитал в главе 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, если этого можно избежать, пожалуйста.