Свободный шаблон NHibernate для IHttpModule и консольных приложений - PullRequest
3 голосов
/ 09 июня 2011

В настоящее время у меня есть веб-приложение C # MVC 2, использующее Fluent NHibernate (+ LINQ) в шаблоне репозитория, и я использую Ninject для обработки требования конструктора контроллера MVC, чтобы оно передавалось в репозиторий.

Мой код Fluent NHibernate в настоящее время подключен к IHttpModule, поэтому сеанс можно открывать и закрывать с помощью веб-запроса.

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

Сначала я решил переместить логику своей базы данных в мою модель предметной области. Я предполагаю, что это плохое поведение, но здесь я прошу помощи в разработке кода, поэтому, пожалуйста, не стесняйтесь вносить предложения. Я хотел сделать это, потому что я хочу написать консольное приложение + веб-приложение для этой модели домена, не заботясь о том, где и как хранятся данные. Возможно, у меня должен быть отдельный проект "Инфраструктура", который использует модель предметной области для выполнения конкретной реализации?

Возвращаясь к вопросу ... Я сталкиваюсь с проблемой, когда кажется, что GetCurrentSession () Fluent NHibernate предполагает, что вы используете Интернет - происходит сбой, и я получаю трассировку к некоторому коду NH с упоминанием WebSession.

Для справки код здесь: https://github.com/cthielen/RightsManagement.

Мои извинения за то, что я не слишком конкретен; Я ищу совет по проектированию кода для лучшей обработки FNH + Linq в шаблоне репозитория, который хорошо работает как с веб-интерфейсом, так и с консольным приложением - и отдельно спрашиваю, должно ли мое подключение к базе данных (т.е. логика NH) быть в проекте домена или нет.

Ответы [ 2 ]

1 голос
/ 09 июня 2011

Я часто использую объект сеанса, чтобы указать, что я собираюсь работать с чем-то (это не реализация единицы работы, так как я не сохраняю всю работу до определенного момента)

using (var session = SessionFactory.Create())
{
   // do all work here
}

Этоработает, поскольку даже консольные приложения имеют начальную точку, в которой можно инициировать сеанс (например, когда пользователь написал команду в консоли).

Фабрика сеансов имеет SessionCreated и SessionDestroyedсобытие, которое может быть перехвачено чем угодно, в нашем случае это фабрика сессий nhibernate.

Это хороший абстрактный способ получить поддержку соединения с базой данных или чего-либо еще без использования жестких зависимостей

1 голос
/ 09 июня 2011

Это хороший вопрос.Есть много разных способов ответить на этот вопрос, но каждый ответ будет зависеть от того, какой у вас опыт работы с различными подходами.Например, вы знакомы с TDD?Внедрение зависимости?Контейнеры IoC?И так далее.

Лучший совет, который я могу дать на этом этапе, - очистить все существующие классы, чтобы они не зависели от контекста.Одним из примеров этого может быть изменение классов вашего репозитория таким образом, чтобы они принимали объект ISession в качестве аргумента конструктора, а не зависели от того, что кажется одноэлементным экземпляром, который существует, только если вы находитесь в контексте HTTP.Это позволило бы вам реорганизовать логику создания сеанса на более высокий уровень вне логики вашего домена.

public class PeopleRepository {
    public PeopleRepository(ISession session) {
        // store session
    }
}

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

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

Я рад предоставить дополнительные рекомендации.Дайте мне знать.

...