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

fle*_*her 14 .net assemblies access-modifiers internalsvisibleto

我知道InternalVisibleTo属性用于使用内部访问修饰符向指定的程序集公开类型和方法.我只使用它来将内部方法暴露给包含一组单元测试的单独程序集.

我正在努力想到应该使用它的另一个场景.该属性是否专门用于辅助单元测试,还是有其他原因?

Eli*_*sha 14

一个场景可能是您在程序集之间分离逻辑(如内部数据对象和逻辑层).您不希望将类公开给用户,但仍希望在自己的程序集中使用这些对象.

我认为这不是一个非常常见的场景,我几乎没有InternalsVisibleTo在非单元测试环境中使用.


Nie*_*est 7

此方案类似于Elisha的方案,但目标是在域驱动设计中强制正确使用您的域模型.

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

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

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

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


Wil*_*mpt 6

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

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