我不相信无论如何你问什么。如果您考虑序列化对象时会发生什么,您仍然需要程序集来提供字段在数据流中的布局方式的低级结构。它需要接口中的代码说前 4 个字节是双精度,等等。
所以唯一要做的就是将你的接口移动到一个新的interfaces.dll中,它可以被所有东西引用。您将看到这种模式在许多示例中重复出现,包括 EnterpriseLibrary。
但是...您犯了一个典型的错误。你为什么要把你的代码分成这么多项目?项目确实应该被视为我们代码的运行时打包,而不是设计时间隔离机制。通过拆分成这么多程序集,您可以做三件事。
- 您会减慢构建系统的速度,因为编译器会做更多的工作来获取其他程序集。
- 您会减慢 Visual Studio 的速度,因为加载所有项目并保持它们之间的引用更加困难。我曾经研究过一个包含 140 个项目的解决方案,只需要 15 分钟就可以打开(但我总是早上喝咖啡)。
- 您降低了运行时性能,因为 DotNet 必须四处搜索另一个 4k dll(这是最小值,即使只有一行代码)。尝试查看融合日志或使用 SysMon 来了解这个简单的操作涉及多少工作。
看看这个例子关于如何优化代码的提示确实会看到随着您的解决方案变得更加复杂会发生什么。
与其像这样拆分它,不如使用命名空间,您仍然可以进行分隔,但不必使用这么多引用,您现在可以通过类中的 using 语句进行控制。您将轻松查看是否在设计为 DSFinalProject 层的类中使用 DAL 引用。您可以在项目下创建一个文件夹并在那里添加您的类。摆脱所有项目,仍然有一个适当的分层系统。
随着您的解决方案的增长,等到您至少有两个可执行文件,然后再开始引入项目,然后考虑运行时影响。如果您总是要加载两个程序集,请将它们合并为一个(我最近看到一些开源项目也使用 ilmerge 合并到第三方库中)。