【问题标题】:c# interface referencesc# 接口引用
【发布时间】:2012-09-21 22:13:59
【问题描述】:

大家好

目前我有以下参考结构:

DSF​​inalProject 有"DAL" 项目和"DataStructure" 项目的引用。

DataStructure 也有 DAL 项目的引用...

现在我希望DSFinalProject 不会引用DAL 层,但能够使用该类中的接口。

有什么方法可以"tunnel" DAL 项目中的接口到 DSFinalProject 而不在它们之间实际进行引用?

也许使用 DataStructure 项目?还是别的什么?

提前感谢您的帮助:)

【问题讨论】:

  • 将接口移动到不同的项目?
  • 这是我的解决方案之一,但我正在尝试寻找其他方法。而不是添加对另一个项目的引用,只需使用 DataStructure 来访问 DAL 接口
  • 只要DataStructure 不引用DAL(它不应该),它就可以工作
  • :s 我想我不明白,我想消除 DSFinlProject 和 DAL 之间的依赖关系,但同时使用 DAL 的接口

标签: c# interface reference project


【解决方案1】:

最简单的方法是将它们放在DataStructure 中,这还不错,因为任何引用接口的东西也需要引用DataStructure

我的投票是将它们放在那里,直到您遇到需要将接口放在单独的程序集中的场景。

【讨论】:

  • 谢谢...我将根据您的回答重新设计我的解决方案 :)
【解决方案2】:

我不知道在没有对项目(或程序集)的引用的情况下,可以通过任何方式从 DSFinalProject 引用 DAL 项目中的接口(或其他任何东西)。

您可以将它们移动到 另一个 项目,如果您认为这会使依赖项更清晰 - 如果您将接口放在 DataStructure 项目中 - 您会遇到需要 DAL 和 DAL 的循环引用需要它。

【讨论】:

    【解决方案3】:

    我不相信无论如何你问什么。如果您考虑序列化对象时会发生什么,您仍然需要程序集来提供字段在数据流中的布局方式的低级结构。它需要接口中的代码说前4个字节是双精度等。

    所以唯一要做的就是将你的接口移动到一个新的interfaces.dll中,它可以被所有东西引用。您会看到这种模式在许多示例中重复出现,包括 EnterpriseLibrary。

    但是... 你犯了一个经典的错误。你为什么要把你的代码分成这么多项目?项目确实应该被视为我们代码的运行时打包,而不是设计时间隔离机制。通过拆分成这么多程序集,您可以做三件事。

    1. 您会降低构建系统的速度,因为编译器在获取其他程序集时会做更多的工作。
    2. 您会减慢 Visual Studio 的速度,因为它会更加努力地加载所有项目并保持它们之间的引用。我曾经研究过一个包含 140 个项目的解决方案,只需要 15 分钟就可以打开(但我早上总是喝咖啡)。
    3. 您降低了运行时性能,因为 DotNet 必须四处搜索另一个 4k dll(这是最小值,即使只有一行代码)。尝试查看融合日志或使用 SysMon 来了解这个简单的操作所涉及的工作量。

    看看这个例子Hints on how to optimise code 看看随着你的解决方案变得越来越复杂会发生什么。

    不要像这样拆分它,而是使用命名空间,您仍然可以进行分隔,但不必使用这么多引用,您现在可以通过类中的 using 语句进行控制。您将轻松查看是否在设计为 DSFinalProject 层的类中使用 DAL 引用。您可以在项目下创建一个文件夹并在那里添加您的类。摆脱所有项目,仍然有一个适当分层的系统。

    随着您的解决方案不断增长,请等到至少有两个可执行文件之后再开始引入项目,然后再考虑运行时的影响。如果您总是要加载两个程序集,请将它们合并为一个(我最近看到一些开源项目也使用 ilmerge 合并到第三方库中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 2015-08-20
      相关资源
      最近更新 更多