【问题标题】:How to re-export types from a referenced .NET assembly如何从引用的 .NET 程序集中重新导出类型
【发布时间】:2013-08-30 05:42:40
【问题描述】:

我们有一个由许多模块组成的大型 .NET 项目,这些模块被实现为 Visual Studio 库项目并编译成各自的程序集 (DLL)。

我们有一个分层架构,我们通过设置 Visual Studio 项目/程序集之间的引用来管理模块/层之间的依赖关系。这使我们能够将 API/SPI 与实现分开,并将不同的层分开,从而有效地执行我们架构的约束。

但是,有时我们希望我们可以(以传递方式)将一个程序集中导入的类型重新导出到引用导入程序集的任何其他程序集。

例如,假设在程序集A中定义了一个类型T,程序集B引用A,程序集C引用B,如下所示:

A <-- B <-- C

我们希望在程序集 C 中“查看”类型 T,而不是在程序集 C 中明确设置对 A 的引用。我们想以某种方式重新导出B 中对A 的引用。

有可能吗?

P。 S. 为什么我们要这样做?因为在整个应用程序中使用了某些类型(想想实用程序/帮助程序类或公共接口),并且在每个依赖于这些类型的项目中复制引用会很烦人。此外,当我们重构代码并移动它们时,由于缺少引用,我们会收到很多错误消息。

编辑

为了澄清,这是一个简单的图表。

Consumer B 不仅依赖于B,还依赖于A,因为B 扩展了A。但是,如果A 定义在与B 的程序集不同的程序集中,那么我们还必须添加对A 程序集的引用(同样适用于提供程序)。但是实际上没有需要添加这个引用,因为对A的依赖遵循我们依赖BB扩展@987654347这一事实@。我们真正需要的是以某种方式重新导出BA 的依赖。

这种情况怎么会出现?假设只有一个接口B,并且您决定从B 中提取公共接口(@98​​7654351@)并将其放置在单独的程序集中,以便其他一些模块可以重用新接口而不添加对原始接口的依赖.就这样:现在您必须在之前使用 B 的任何地方添加对新程序集的引用。

【问题讨论】:

  • 我会说你最好有一个单一的核心或助手程序集,其中包含所有其他程序集引用的所有“在整个应用程序中使用的类型”。让所有其他 VS 项目引用单个项目是一个干净且易于遵循的约束,比尝试通过 TypeForwardedToAttribute 传播常见类型的使用要干净得多。
  • 我们从这种方法开始,但最终发现它不能很好地扩展:它导致一个胖核心模块在一个地方包含许多用于各种目的的类 - 一个全有或全无的解决方案可以这么说。当然,问题在于,并非所有类都在整个应用程序中平等地使用:应用程序的某些部分需要这些类,而另一些部分需要不同的类。把它们都放在一个地方是不合理的。
  • “当然,问题是,并非所有类都在整个应用程序中被平等地使用”好吧,你没有提到 :) 看起来你正试图找到一个技巧来逃避正确的代码结构重构。这种重构将定义一组低层核心组件,高层将依赖这些组件。 “应用程序的某些部分需要这些类,而其他部分需要不同的类。”定义将成为低级组件的类组似乎是一个好的开始。
  • 尽管您进行了新的编辑,但我认为您需要的不是一种隐式引用“基础”程序集的方法。我曾经写过一篇关于我们如何重组代码库的博客文章,只要你只触及代码结构而不是方法体,它似乎比预期的要便宜。希望这会有所帮助:codebetter.com/patricksmacchia/2009/02/15/…
  • @dario_ramos 感谢您的帮助,但老实说,我认为这只会让事情变得更糟:我不需要添加对整个项目的引用,而是需要包含所需的 every从该项目中提取文件以使其工作。

标签: .net visual-studio architecture dependencies


【解决方案1】:

.net 中的程序集有一个属性,您可以在其中告诉程序集它期望存在的类型将在另一个中。

[assembly:TypeForwardedToAttribute(typeof(Example))]

在我看来Type Forwarding 的用法是http://msdn.microsoft.com/en-us/library/ms404275.aspx

另见How do you explain type forwarding in simple terms?

【讨论】:

  • 谢谢!我会检查一下。我不确定这是否真的是我们需要的(我们当然不想说明哪些类型位于哪些程序集中),但这是一个开始。 ;-)
猜你喜欢
  • 2021-01-21
  • 2012-04-23
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
相关资源
最近更新 更多