什么时候应该使用 [assembly: InternalsVisibleTo()]?

Posted

技术标签:

【中文标题】什么时候应该使用 [assembly: InternalsVisibleTo()]?【英文标题】:When should [assembly: InternalsVisibleTo()] be used? 【发布时间】:2011-03-17 19:36:07 【问题描述】:

我了解 InternalVisibleTo 属性用于向指定程序集公开具有内部访问修饰符的类型和方法。我只用它来将内部方法暴露给包含一套单元测试的单独程序集。

我正在努力考虑应该使用它的另一种情况。这个属性是专门为了帮助单元测试而引入的还是有其他原因?

【问题讨论】:

【参考方案1】:

您可以在程序集之间分离逻辑(如内部数据对象和逻辑层)。您不想将类公开给您的用户,但您仍想在自己的程序集中使用这些对象。

我认为这不是一个很常见的场景,我很少在非单元测试上下文中使用 InternalsVisibleTo

【讨论】:

我同意。我只在单元测试场景中使用它,但是您描述的场景是合理的。【参考方案2】:

此方案类似于Elisha's 的方案,但旨在强制正确使用Domain-driven design 中的域模型。

假设您有一个程序集MyProject.Core,其中包含您的所有域模型。如果您不希望其他人直接创建您的域模型的实例,您可以将构造函数设为internal

另一个名为MyProject.Services 的程序集包含专门用于创建有效域对象的域服务。该程序集将引用MyProject.CoreInternalsVisibleTo 属性用于授予域服务程序集对 internal 构造函数的访问权限。

MyProject.ServicesMyProject.Core 的引用的另一个好处是它不允许域对象保留对域服务的任何引用,这被认为是另一个好的 DDD 实践。

注意:我从未在实践中应用过上述场景,因此在 DDD 级别上可能并不完全准确。但这是我能想到的InternalsVisibleTo 的用法,与单元测试无关。

【讨论】:

【参考方案3】:

除了测试之外,我使用过InternalsVisibleTo 属性的唯一其他场景是在创建序列化程序集时。

除此之外,我从未使用过,也不需要它。

【讨论】:

以上是关于什么时候应该使用 [assembly: InternalsVisibleTo()]?的主要内容,如果未能解决你的问题,请参考以下文章

什么时候应该在 x86 汇编中使用 MOVS 而不是 MOV?

please inter the path for libcd.pdb

maven 里 assembly 和 package 打包的区别

Visual Studio 2010 SP1 可以安全安装吗?Assembly 签名到底是啥?

如何使用 assemble-middleware-i18n?

assembly 需要 unload 和 update 的时候怎么办?