我使用Domain Model,StructureMap和Fluent NHibernate进行以下项目结构:
我遇到的问题是Fluent NHibernate要求以下所有内容成为网站的bin目录,以便它在运行时工作:
- Antlr3.Runtime.dll *
- 的 Castle.Core.dll
- 的 Castle.DynamicProxy2.dll
- FluentNHibernate.dll *
- Iesi.Collections.dll *
- log4net.dll *
- 的 NHibernate.ByteCode.Castle.dll
- NHibernate.dll *
我遇到的问题是并非所有这些程序集都输出到我网站的bin目录中。目前只有*
的项目才能正确输出。 bin目录中缺少粗体中的项目。
现在,我想假设这是因为我没有将它们添加为我的Fluent NHibernate
项目的引用。我目前唯一的参考是 NHibernate.dll 和 FluentNHibernate.dll 。仅这两个引用就足以通过标有*
的项目,但它们不会带来缺失的项目。
所以,我接着想到让它们全部通过我只是添加它们作为Fluent NHibernate
项目的引用。不幸的是,这没有任何区别; bin目录中仍然缺少相同的项目。
我从未真正理解视觉工作室如何决定要复制哪些程序集。我一直认为它是标记为 Copy Local = true 的任何程序集,但在这种情况下似乎不是这种情况。
当然我可以将所有的程序集引用添加到Website
中,但之后就完成了通过StructureMap
松散耦合项目的问题。
有没有人知道为什么会丢失装配以及如何让它们正确复制?
答案 0 :(得分:4)
您可以添加对项目的引用,这些引用要求这些文件出现在输出目录中(在您的案例中为Website),或者您可以在构建脚本中添加一个构建后步骤来复制它们。
这是VS和编译器关于是否实际需要引用的“智能”的情况。 C#编译器优化了那些实际上不需要的引用。在VS中添加对非必需程序集的引用将确保它出现在该项目的输出目录中。但是,依赖项目只有在引用它的项目实际使用时才会获得相同的程序集。也就是说,如果C#编译器没有优化其引用。这就是为什么你需要添加对网站项目的引用,如果你走那条路。
就个人而言,我的确如此。我不认为这是紧耦合,因为NH仍然在运行时动态地解析组件。并不是说我不能手动替换其他字节代码程序集并重新启动我的应用程序。但是,如果没有足够的测试,它也不会像我 那样做,所以在某种程度上我认为自己会在此基础上与Castle结合。因此,我对参考文献并不感到厌烦。