Я организую решение VisualStudio 2008, используя Fluent NHibernate, и я хотел бы сохранить все зависимости dll NHibernate, скрытые в библиотеке классов «Back End», и позволить интерфейсному веб-приложению или консольному приложению не знать о NHibernate.
Моя структура решения выглядит следующим образом:
BackEnd - Библиотека классов - Бизнес-логика и репозитории данных и общедоступный API-интерфейс. Этот уровень использует NHibernate для хранения данных в частном порядке и не предоставляет никакие классы NHibernate для внешнего интерфейса
Public - Библиотека классов --- POCO Объекты без зависимостей, используемые как интерфейсом, так и компонентом. Backend использует NHibernate для сохранения этих объектов.
Front End - Консольное приложение и веб-приложение MVC - (Два интерфейсных приложения (1) Веб-приложение MVC2 && (2) консольное приложение) ссылаются на проекты Public и Back End и просто используйте несколько открытых методов для взаимодействия с Back-end с помощью открытых объектов.
Что я хотел бы сделать, так это только сослаться на NHibernate и его многочисленные зависимости, когда-то в Back End, и чтобы приложения Front End просто ссылались на бэкэнд-проект. Тем не менее, Fluent BackEnd аварийно завершает работу во время выполнения, если я не ссылаюсь на каждую из зависимостей Nhibernate в моем приложении переднего плана в дополнение к ссылкам на них в Back end. Вот код Back End, который вылетает при жалобе, что не может найти библиотеки nhibernate, когда внешний интерфейс пропускает ссылку:
public static ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(SQLiteConfiguration.Standard.UsingFile(DbFile))
.Mappings(m => m.AutoMappings
.Add(AutoMap.AssemblyOf<EngineInfo>(type => type.Namespace.Contains("BackEnd"))
.Conventions.Add(DefaultCascade.All())
.Conventions.Add(DefaultLazy.Never())
)
) //emd mappings
.ExposeConfiguration(BuildSchema)//Delete and remake a fresh tmp db
.BuildSessionFactory();//finalizes the whole thing to send back.
}
Может быть, я случайно открыл зависимый ресурс NHibernate для приложений переднего плана, но я не получаю никаких ошибок во время компиляции, и мне бы хотелось немного поработать.
Если я ссылаюсь на dll Nhibernate, все работает нормально, но в моих приложениях переднего плана я получаю следующее предупреждение во время компиляции:
*
Найдены конфликты между разными
версии того же зависимого
сборка.
*
Есть предложения?
- Обновление -
Я сузил библиотеки, на которые я должен ссылаться в начале, до
NHibernate.ByteCode.Castle.dll и
System.Data.SQLite
Я могу пропустить все остальные и не получить ошибки во время выполнения .. по крайней мере, пока нет.
Я до сих пор не уверен, зачем это нужно, потому что внешний интерфейс никогда не использует ресурсы NH или SQL lite, кроме как через открытый интерфейс внутреннего интерфейса, который не предлагает никаких ресурсов Nhibernate или SQLite. Все классы, которые касаются NHibernate или SQLite, помечены как внутренние, поэтому я не уверен, что может вызвать эту зависимость.
Визуальное предупреждение о зависимости от студии предлагает решение, которое я не решаюсь применить, так как не знаю, почему проблема возникла в первую очередь:
Хотите исправить эти конфликты, добавив записи перенаправления привязки в файл appconfig? --- MSDN по выбору - http://msdn.microsoft.com/en-us/library/bb383993.aspx
Любой совет?
--- Update ---
Том ниже, кажется, повторил мою проблему, так что это начинает звучать как ошибка DLL NHibernate. Я также попытался обновить VS 2008 до 2010, перестроить все решение и повторил ошибку там. Кто-нибудь хочет взглянуть, чтобы убедиться, что мы что-то не упустили, прежде чем я сообщу об этом?