2

问题

.NET Framework 中是否有一种机制可以在不使用单独的项目/程序集的情况下隐藏一个自定义类型?我不是在谈论将 Type 的成员隐藏在另一种类型中的访问修饰符——我的意思是隐藏 Type 本身。

背景

我在一个 ASP.NET 网站项目中工作,团队决定不对不同的软件层使用单独的项目程序集。因此,我正在寻找一种方法,例如,我不允许其类访问同一 ASP.NET 网站项目中的其他类型的 DataAccess/ 文件夹。换句话说,我想伪造这些层,并在每一层周围都有某种安全机制,以防止它访问另一层。

更多信息和细节...

显然,没有办法使用特定于语言的 OO 关键字来强制执行此限制,因此我正在寻找其他东西,例如:可能是权限框架或代码访问机制,可能是使用元数据(如属性)的东西。甚至限制一个命名空间访问另一个命名空间的东西。我不确定它可能采取的最终形式。

如果这是 C++,我可能会使用friend它作为解决方案,在这种情况下它不会转换为 C# internal,尽管它们经常被比较。

我真的不在乎该解决方案是否实际上将类型彼此隐藏或只是使它们无法访问;但是我不想从所有其他类型中锁定一个类型,这是访问修饰符不是解决方案的另一个原因。运行时或设计时的答案就足够了。寻找易于实现的东西,否则不值得努力......

4

2 回答 2

3

您可以使用 NDepend 来执行此操作:

http://www.ndepend.com/

NDepend 可以允许您通过指定某些命名空间不应相互引用来强制执行“分层”规则。然后,您将 NDepend 和规则集插入到您的自动构建中,如果有任何轻罪,它将导致构建失败(带有完整报告)。

通过这种方式,您可以在程序集中实施逻辑软件分层概念,而无需使用项目结构进行物理操作。

更新

我昨晚很晚才回答了这个问题,而是从字面上看,即如何直接解决这个问题。尽管可以使用一种工具来解决问题,但随着项目的发展,在整个团队的一个项目中进行开发很可能会是一种非常痛苦的经历:

  • 除非人们非常自律,否则构建将不断破坏分层违规行为。
  • There will be source control merge thrashing on the VS project file - not pleasant.
  • Your unit of re-use is very large and undefined if you want to share assemblies with other applications\projects you are developing. This could lead to very undesired coupling.

Although I do not advocate having lots of tiny assemblies, a sensible number defined around core concepts is very workable and desirable e.g. "UI", "data access", "business logic", "common library" and "shared types".

于 2010-05-23T01:24:19.417 回答
0

开箱即用;可能有一些 3rd-party 工具可用于将一些规则组合在一起,可能基于命名空间等。像自定义 fx cop 规则之类的东西......

于 2010-05-22T23:55:05.523 回答