【发布时间】:2011-03-17 19:36:07
【问题描述】:
我了解 InternalVisibleTo 属性用于向指定程序集公开具有内部访问修饰符的类型和方法。我只用它来将内部方法暴露给包含一套单元测试的单独程序集。
我正在努力考虑应该使用它的另一种情况。这个属性是专门为了帮助单元测试而引入的还是有其他原因?
【问题讨论】:
标签: .net assemblies access-modifiers internalsvisibleto
我了解 InternalVisibleTo 属性用于向指定程序集公开具有内部访问修饰符的类型和方法。我只用它来将内部方法暴露给包含一套单元测试的单独程序集。
我正在努力考虑应该使用它的另一种情况。这个属性是专门为了帮助单元测试而引入的还是有其他原因?
【问题讨论】:
标签: .net assemblies access-modifiers internalsvisibleto
您可以在程序集之间分离逻辑(如内部数据对象和逻辑层)。您不想将类公开给您的用户,但您仍想在自己的程序集中使用这些对象。
我认为这不是一个很常见的场景,我很少在非单元测试上下文中使用 InternalsVisibleTo。
【讨论】:
此方案类似于Elisha's 的方案,但旨在强制正确使用Domain-driven design 中的域模型。
假设您有一个程序集MyProject.Core,其中包含您的所有域模型。如果您不希望其他人直接创建您的域模型的实例,您可以将构造函数设为internal。
另一个名为MyProject.Services 的程序集包含专门用于创建有效域对象的域服务。该程序集将引用MyProject.Core。 InternalsVisibleTo 属性用于授予域服务程序集对 internal 构造函数的访问权限。
从MyProject.Services 到MyProject.Core 的引用的另一个好处是它不允许域对象保留对域服务的任何引用,这被认为是另一个好的 DDD 实践。
注意:我从未在实践中应用过上述场景,因此在 DDD 级别上可能并不完全准确。但这是我能想到的InternalsVisibleTo 的用法,与单元测试无关。
【讨论】:
除了测试之外,我使用过InternalsVisibleTo 属性的唯一其他场景是在创建序列化程序集时。
除此之外,我从未使用过,也不需要它。
【讨论】: