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

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

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

【问题讨论】:

    标签: .net assemblies access-modifiers internalsvisibleto


    【解决方案1】:

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

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

    【讨论】:

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 2011-04-15
        • 2017-04-10
        • 2012-03-19
        • 2018-05-12
        • 2018-12-11
        • 1970-01-01
        • 2022-09-28
        • 2021-09-07
        相关资源
        最近更新 更多