问题
.NET Framework 中是否有一种机制可以在不使用单独的项目/程序集的情况下向另一种类型隐藏一种自定义类型?我不是在谈论从另一个类型隐藏类型成员的访问修饰符 - 我的意思是隐藏类型本身。
背景
我正在从事 ASP.NET 网站项目,团队决定不对不同的软件层使用单独的项目程序集。因此,我正在寻找一种方法来拥有一个 DataAccess/文件夹,我不允许其中的类访问同一 ASP.NET 网站项目中的其他类型。换句话说,我想伪造这些层,并在每个层周围有某种安全机制,以防止它访问另一层。
更多信息和详细信息...
显然,没有办法使用特定于语言的 OO 关键字来强制执行此限制,因此我正在寻找其他东西,例如:可能是权限框架或代码访问机制,可能是使用属性等元数据的东西。即使是限制一个 namespace 访问另一个 namespace 的东西。我不确定它可能采取的最终形式。
如果这是 C++,我可能会使用 friend
作为解决方案,在这种情况下,这不会转换为 C# internal
,尽管它们经常被比较.
我并不真正关心该解决方案是否实际上隐藏了彼此的类型或只是使它们无法访问;但是我不想锁定一种类型与所有其他类型,这是访问修饰符不是解决方案的另一个原因。运行时或设计时的答案就足够了。寻找易于实现的东西,否则不值得付出努力......
最佳答案
您可以使用 NDepend 来执行此操作:
NDepend 可以允许您通过指定某些 namespace 不应相互引用来强制执行“分层”规则。然后,您将 NDepend 和规则集插入到自动构建中,如果存在任何不当行为,构建将会失败(带有完整报告)。
通过这种方式,您可以在程序集中强制执行逻辑软件分层概念,而无需使用项目结构来实际执行。
更新
我昨晚很晚回答了这个问题,确切地说,就是如何直接解决这个问题。尽管可以使用工具来解决问题,但随着项目的发展,整个团队在一个项目中进行开发很可能会是一种非常痛苦的经历:
- 除非人们非常自律,否则构建将会因分层违规而不断崩溃。
- VS 项目文件上将会出现源代码管理合并抖动 - 不太愉快。
- 如果您想与您正在开发的其他应用程序\项目共享程序集,那么您的重用单元非常大且未定义。这可能会导致非常不希望的耦合。
虽然我不提倡拥有大量的小型组件,但围绕核心概念定义的合理数量是非常可行和可取的,例如“UI”、“数据访问”、“业务逻辑”、“公共(public)库”和“共享类型”。
关于c# - .NET 安全机制限制同一项目中两种类型之间的访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2890167/