Сделайте NHibernate полностью живым в рамках проекта DataAccess - PullRequest
1 голос
/ 14 января 2012

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

Как мне сделать NHibernate, все его библиотеки DLL и XML конфигурации в рамках проекта библиотеки классов?Мое решение - это классическое трехуровневое приложение с веб-слоем (MVC3), ссылающимся на бизнес-уровень (библиотека классов), ссылающимся на слой доступа к данным (библиотека классов).Прямых ссылок с веб-слоя на уровень доступа к данным нет.

Я сталкиваюсь со всеми видами проблем, такими как NHibernate, пытаюсь найти файл hibernate.cfg.xml в каталоге root / bin.он не может найти NHibernate.ByteCode.Castle или одну из его зависимостей, а также некоторые случайные другие, когда я возиться с вещами.Все работает нормально, когда я ссылаюсь на все библиотеки DLL NHibernate в проекте MVC, а также на проект DataAccess и помещаю hibernate.cfg.xml в проект MVC, но обе эти программы кажутся мне плохой идеей.

Просто должен быть простой способ сделать это!

Может кто-нибудь указать мне на пример проекта, который настраивает NHibernate таким образом?

Ответы [ 4 ]

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

Итак, я нашел ответ на свой вопрос.Причина, по которой файл hibernate.cfg.xml должен был находиться в веб-каталоге, заключалась в том, как я на него ссылался.Вместо того, чтобы ссылаться на него по имени, вы должны встраивать ресурс и ссылаться на него полностью квалифицированным образом:

Configuration configuration = new Configuration().Configure(Assembly.GetExecutingAssembly(), "MyDataAccessApp.hibernate.cfg.xml");

Во-вторых, необходимая библиотека NHibernate.ByteCode.Castleне был помещен в корневую папку BIN из-за ошибочного представления Visual Studio о том, что он не нужен (поскольку на него нет явных ссылок на код).Итак, эту проблему можно решить тремя способами, которые я нашел:

  • Добавить строку кода, обновляющую объект в пространстве имен Castle (не рекомендуется, но это работает ...)
  • Добавьте скрипт сборки, чтобы скопировать необходимую DLL в BIN.(Решение DavidAndroidDev должно работать)
  • Наконец, я пошел путем добавления ссылки на DLL к вашему MVC-проекту и просто назвал его днем.

Надеюсь, этоможет помочь кому-то еще.

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

Как я отметил в комментарии, «лучший» способ автоматизировать это - скрипт пост-сборки, который запускается после сборки в проекте DataLayer.

Я бы поставил

copy $(TargetDir)\NHibernate.ByteCode.Castle.dll $(SolutionDir)\REL_PATH_TO_MVC_PROJECT\bin

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

0 голосов
/ 16 января 2012

Я только что запустил ILDasm на NHibernate.dll (v.2.1.2) из ​​командной строки Visual Studio, и нет AssemblyRef для NHibernate.ByteCode.Castle.

Итакпроблема не в Visual Studio как таковой, проблема в том, что библиотека Nhibernate не ссылается напрямую на зависимую сборку.Я смутно помню, что читал, что это потому, что DLL-библиотеки Castle нужны только при ленивой загрузке, но это вызвало проблемы у многих людей, включая меня самого.

В итоге я использовал скрипт посткомпоновки, как предложено DavidAndroidDev,Ужасно, но это работает.

Обратите внимание, что последняя версия NH - v3.2 - имеет встроенный поставщик байт-кода и больше не требует DLL-библиотеки Castle.

Однако янедавно был обновлен непосредственно с NH 2.1.2 / FNH 1.0 до NH 3.2 / FNH 1.3 (предварительная версия) и обнаружил несколько серьезных изменений в обоих компонентах.Поэтому для нового пользователя FNH, вероятно, лучше остаться со старой версией.

0 голосов
/ 16 января 2012

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

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