流畅的NHibernate解决方案结构 - 如何在Web App / Console App的后端引用DLL一次

时间:2010-02-20 18:28:41

标签: c# visual-studio-2008 nhibernate fluent-nhibernate

我正在使用Fluent NHibernate组织一个VisualStudio 2008解决方案,我想将所有NHibernate dll依赖项隐藏在“Back End”类库中,让前端Web应用程序或Console应用程序不知道NHibernate。

我的解决方案结构如下:

BackEnd - 类库 - 业务逻辑和数据存储库& public API ..这个级别私有地使用NHibernate进行数据存储,并且不会将任何NHibernate类暴露给前端

公共 - 类库--- POCO对象,前端和后端都没有使用依赖关系。后端使用NHibernate来持久保存这些对象。

前端 - 控制台应用& MVC Web应用程序 - (两个前端应用程序(1)MVC2 Web应用程序&和(2)控制台应用程序)引用Public& Back End项目,只需使用一些公共方法即可使用Public对象与后端进行交互。

我想要做的只是在后端引用NHibernate及其许多依赖项,并让前端应用程序仅引用后端项目。但是,如果我在前端应用程序中没有引用Nhibernate的每个依赖项,除了在后端引用它们之外,Fluent BackEnd在运行时崩溃。这是后端代码崩溃抱怨它在前端省略引用时无法找到nhibernate dll:

   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依赖资源暴露给前端应用程序,但我没有得到任何编译时错误,我喜欢一点方向。

如果我参考Nhibernate的dll,一切运行正常,但在我的前端应用程序中,我在编译时收到以下警告:

*

  

发现不同之间的冲突   相同依赖的版本   组装

*

有什么建议吗?

- 更新 -

我已经缩小了我必须在前端引用的dll NHibernate.ByteCode.Castle.dll和 System.Data.SQLite 我可以跳过所有其他人而不会出现运行时错误..至少没有。

我仍然不确定为什么要么这样做,因为前端从不使用任何NH或SQL lite资源,除非通过后端的公共接口不提供任何Nhibernate或SQLite资源。所有触及NHibernate或SQLite的类都标记为Internal,所以我不确定是什么原因导致这种依赖。

视觉工作室依赖性警告提供了一个解决方案,我有点犹豫不决,因为我不知道为什么问题出现在第一位:

是否要通过将绑定重定向记录添加到appconfig文件来修复这些冲突? ---关于选项的MSDN - http://msdn.microsoft.com/en-us/library/bb383993.aspx

有什么建议吗?

--- ---更新 下面的Tom似乎已经复制了我的问题所以这开始听起来像一个NHibernate DLL错误。我也尝试从VS 2008升级到2010并重建整个解决方案并在那里复制错误。在我尝试报告之前,是否有人想要确保我们没有遗漏某些内容?

4 个答案:

答案 0 :(得分:3)

我正在开发一个具有类似架构的项目,并且昨天遇到了类似的问题 - 需要在我的项目中包含NHibernate的引用,即使代码中没有直接引用这些程序集。

否则,出现运行时错误,抱怨无法找到NHibernate.ByteCode.Castle。

问题原来是我建造的方式。 NHibernate程序集没有被正确地传播到我的应用程序的运行时目录,因为我使用的是标准的VS2008文件夹结构(bin \ Debug等)。

修复的第一部分是创建一个目录,其中构建并运行所有程序集。您可以通过为解决方案中的所有项目设置输出路径(在项目的“构建”选项卡上)来指向此目录。

修复的第二部分是为所有NHIbernate引用设置Copy Local = True,以及解决方案中的其他程序集(您不需要为标准程序集设置它 - 系统等)。这会导致VS在每次构建时将项目使用的所有程序集复制到公共运行时目录。

然后,您应该能够从所有不直接使用它们的项目中删除NHibernate引用。

这对我有用,但我不禁想知道是否有更好的方法来解决这个问题。但它现在会做。

修改

经过一些测试后,似乎所有Castle DLL都存在问题,NHibernate.ByteCode.Castle最显着。

我的应用程序中的一个项目是一个包含NHibernate逻辑的程序集,它包含对所有NHibernate DLL的引用,包括NHibernate.ByteCode.Castle。

当我在另一个项目中添加对该程序集的引用并构建它时,所有NHibernate DLL都会被复制到另一个项目的Output目录 - 除了Castle DLLs!

Other people have had similar problems我尝试了一些建议的解决方法,但没有运气。

我强烈怀疑Castle DLL不能正确支持Microsoft将依赖程序集传播到其他项目的约定,但是我们知道不够确定。

答案 1 :(得分:2)

可能在Web项目中引用了一些与NHibernate相关的dll而不是后端项目。我真的找不到它,删除所有与NHibernate相关的dll,清理你的解决方案,然后将它们添加到后端项目中。

答案 2 :(得分:2)

我解决了这个问题。在我的DataAccess项目中(NHibernate和NHibernate.ByteCode.Castle引用了)我创建了这个简单的类:

/// <summary>
/// This class is only to fix building issue of NHibernate.ByteCode.Castle.dll 
/// not being copied to bin directory of projects referencing data access 
/// (either directly or indirectly)
/// </summary>
internal abstract class ReferenceHelper : ProxyFactory
{
}

我从不使用这个类(显然),但它只存在帮助NHibernate.ByteCode.Castle.dll(和Castle.Core.dll)出现在引用项目的bin /目录中。 在解决方案结构中,我有单独的目录,我放置了所有相关的dll(NHibernate,Castle,Fluent等),所以这里没有GAC。

答案 3 :(得分:1)

你需要急切加载或NHibernateUtils.Initialize你的对象,然后通过网络发送它们,它是城堡代理包装,让你怀疑我怀疑。