【问题标题】:How discretely defined visibility of my assemblies types?如何离散地定义我的程序集类型的可见性?
【发布时间】:2015-04-06 02:43:59
【问题描述】:

我正在使用 .NET 4.5.2 并且需要从程序集 B 访问在程序集 A 中定义的 ClassA,但想要声明 ClassA 作为内部以避免其他程序集访问它。

我不想使用 InternalsVisibleTo,因为我不希望所有程序集 A 类型的内部端都暴露给程序集 B。

总结:我需要对我的程序集类型进行离散定义的可见性。这可能吗?

编辑:StrongNameIdentityPermissionAttribute 与我需要的非常相似,但我只是不希望类型公开,因为我也希望它们在编译时隐藏。

【问题讨论】:

  • 您尝试这样做的事实表明您的设计存在架构缺陷。为什么一开始还有两个程序集?
  • @EricLippert 完全不同意你的观点。不是微不足道的解释为什么我需要离散地授予对另一个程序集的访问权限,但基本上与 DDD 分层架构以及需要从基础设施层而不是来自应用层,并且一些Creation Factories只需要从应用层而不是基础设施层访问。这只是一个例子。

标签: c# .net types visibility .net-assembly


【解决方案1】:

是否可以将A类自己移到新项目中?然后你可以只从项目 B 中引用项目 A,其他项目/程序集不会看到它。

如果这不可能,那么我同意 Eric 的观点,即设计似乎不正确。就像拥有这个标准的项目结构:

project Entity
project Database
project Server
project UserInterface

但在您的情况下,您将实体和数据库混为一谈。所以当 UserInterface 需要使用 Entities 时,它也必须包含无用的数据库代码。

【讨论】:

  • 你对我的设计有正确的看法,我已经向你解释了更多关于它的内容,在这种情况下这有点离题。我只是想确保不存在解决我因设计而遇到的技术问题的方法。如果您了解 DDD,您可能会了解我的设计:域定义构造函数和创建工厂都在不同的层(基础设施和应用程序)中使用,因此域层需要将两种类暴露给不同类型的层。我不想发起关于我的设计的讨论,那将是一个题外话。
  • 当然可以,但是不能只将物理域项目拆分为 Domain.Infrastructure 和 Domain.Application 项目吗?它们仍将形成单个域层,但您可以通过这种方式控制可见性。
  • 当然,但是我会将我的域层拆分为不同的程序集(所有维护成本)只是为了解决“无法离散地暴露于某些组装我的类型”。我们已经以这种方式对事物进行了建模,并且以许多额外的程序集结束,这就是我问这个问题的原因,我不是在寻找重新定义我的架构或如何使用微不足道的 .NET 概念实现它的建议,而是为了解决那个具体的技术问题,仍然,我真的很感谢你为帮助我所做的努力。谢谢你。
  • 我完全理解,当人们试图通过告诉你重新设计来解决问题时,这实际上让我很恼火。但在这种情况下,特别是我觉得没有技术解决方案,所以我的 cmets 确实是在找不到解决方案的情况下。您可能已经检查了用于测试的特殊属性,这些属性有时可用于深入了解装配体的隐藏部分。如果问题很重要,我建议您尝试发布一个简化的项目结构,其中包含一些使用 DDD 的小型工厂方法以具体方式显示问题。
  • 再次感谢您,非常感谢您的帮助。我会检查用于测试的特殊属性,我不考虑;)再次感谢您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多