什么时候应该使用 [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.Core
。 InternalsVisibleTo
属性用于授予域服务程序集对 internal
构造函数的访问权限。
从MyProject.Services
到MyProject.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 签名到底是啥?