3

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

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

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

例如,假设在 assembly 、 assembly references和 assembly referencesT中定义了一个类型,如下所示:ABACB

A <-- B <-- C

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

可能吗?

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

编辑

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

在此处输入图像描述

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

这种情况怎么会出现?假设只有一个接口B,并且您决定从中提取公共接口 ( A)B并将其放置在单独的程序集中,以便其他一些模块可以重用新接口,而无需添加对原始接口的依赖。你去吧:现在你必须添加对B以前使用过的新程序集的引用。

4

1 回答 1

3

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

[assembly:TypeForwardedToAttribute(typeof(Example))]

Type Forwarding对我来说听起来像一个用法http://msdn.microsoft.com/en-us/library/ms404275.aspx

另请参阅您如何简单地解释类型转发?

于 2013-08-27T13:11:16.950 回答