Реализовать метод сохранения внутри (Свободно) сущности / использования NHibernate в качестве уровня бизнес-объекта?Плохая идея? - PullRequest
0 голосов
/ 04 января 2012

Играя с Fluent NHibernate, я попытался реализовать метод сохранения в объекте сущности.Это просто ужасная идея?Кажется, что это было бы идеальным местом для взаимодействия между моей презентацией и базой данных, но тот факт, что мне нужно установить виртуальное ключевое слово для всего, заставляет меня думать, что это никогда не предназначалось для использования таким образом.* Сущность:

public class MyTable : BusinessObject
{
    #region Properties
    /* ... */
    #endregion

    public virtual void Save()
    {
        var sf = CreateSessionFactory();
        using (var s = sf.OpenSession())
        {
            using (var t = s.BeginTransaction())
            {
                s.SaveOrUpdate(this);
                t.Commit();
            }
        }
    }
}

Базовый класс:

public abstract class BusinessObject
{
    protected static NHibernate.ISessionFactory CreateSessionFactory()
    {
        return FluentNHibernate.Cfg.Fluently.Configure()
            .Database(...)
            .Mappings(...)
            .BuildSessionFactory();
    }

}

Ответы [ 3 ]

4 голосов
/ 04 января 2012

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

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

в сторону: вы не хотите создавать фабрику сеансов каждый раз - вы хотите создать ее один раз для времени жизни приложения, а затем создавать сеанс каждый раз, когда вам это нужно (или потенциально реже) - подумайте немного об идее Единицы работы , и если вы запутались в сеансе и фабрике сеансов, я написал this в ответ на аналогичный вопрос некоторое время назад)

3 голосов
/ 04 января 2012

Как уже говорилось, это очень плохая идея.

Но то, что вы пытаетесь сделать, на самом деле является хорошо известным паттерном: Активная запись

Проект, на который я ссылался, основан на NHibernate и уже имеет базовый класс с Save и другими реализованными методами

2 голосов
/ 04 января 2012

Я согласен с @AlexCuse.

Еще одна вещь, которая также отсутствует в приведенной выше реализации, это то, что вы не можете сохранить несколько бизнес-объектов или бизнес-объектов разных типов в одной транзакции, что часто необходимо.

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