Должен ли мой уровень представления создавать сеанс в NHibernate? - PullRequest
2 голосов
/ 17 января 2012

Я изучаю NHibernate и создал несколько юнит-тестов, и все идет хорошо.Мое главное приложение имеет только два слоя:

  1. Презентация (приложение WPF)
  2. Домен (имеет бизнес-логику и доступ к данным)

и, конечно, яу меня есть мой модульный тестовый проект (Test).

Мои модульные тесты вызывают мой класс SessionManager для построения SessionFactory во время [TestFixtureSetup].Каждый [Test] затем получает Session для выполнения проверки модуля доступа к данным.Мне интересно, как мне это сделать в моем проекте WPF.

Я создал простое диалоговое окно, чтобы посмотреть, смогу ли я подключить свое приложение WPF к своей базе данных.Мне кажется неправильным иметь ссылку на NHibernate в моем слое презентаций, правильно ли я в этом чувствую?Если так, как мне получить сеанс для хранения объекта, когда пользователь нажимает Add в моей форме, чтобы что-то сохранить?Вот некоторые из моего кода:

public class SessionManager
{
    private ISessionFactory _sessionFactory;

    public SessionManager()
    {
        _sessionFactory = GetSessionFactory();
    }

    public ISession GetSession()
    {
        return _sessionFactory.OpenSession();
    }

    private ISessionFactory GetSessionFactory()
    {
        return (new Configuration()).Configure().BuildSessionFactory();
    }
}

В моем тестовом проекте у меня есть такие вещи:

    [TestFixtureSetUp]
    public void TestFixtureSetup()
    {
        log4net.Config.XmlConfigurator.Configure();
        DatabaseFixtureSetUp();
        _sessionManager = new SessionManager();
    }

    [SetUp]
    public void Setup()
    {
        DatabaseSetUp();

        _session = _sessionManager.GetSession();
    }

Я не уверен, как структурировать мой код уровня презентации для храненияобъект.У меня есть это в моей форме:

    private void btnAddBroker_Click(object sender, RoutedEventArgs e)
    {
        var broker = new Broker
        {
            Name = txtBrokerName.Text,
            IsActive = (bool)chkIsActive.IsChecked,
            IsDefault = (bool)chkIsDefault.IsChecked
        };

        // save the broker object to the database
        // is it ok to have NHibernate code here? feels wrong

    }

Как бы вы это сделали?

1 Ответ

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

Хотя я не эксперт в приложениях WPF, пришедших из веб-разработки, я бы сказал, что да, на уровне представления неправильно создавать сеанс.

Я бы порекомендовал создать класс Factory (который, как я вижу, вы сделали с SessionManager), который отвечает за создание сеанса NHibernate. Затем ваш бизнес-уровень может вызвать фабричный класс для получения сеанса NHibernate, а затем использовать его на бизнес-уровне для обработки любого запроса, который необходимо выполнить.

Затем вы можете даже внедрить этот фабричный класс и бизнес-уровень, используя Внедрение зависимостей , если вы придерживаетесь принципов МОК .

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

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

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