“内部”成员的细粒度可见性

时间:2010-01-11 13:50:20

标签: c# .net architecture

最近我读到了使用.NET程序集对代码进行分区,并偶然发现了this post的一个很好的建议:“将.NET程序集的数量减少到最低限度”。

我完全同意!我个人经常看到的原因之一是,人们只想隔离一些代码,因此他们将类型/方法内部化并将它们放入一个单独的项目中。

将代码拆分为多个程序集还有很多其他原因(有效而非有效),但如果要隔离组件/ API,同时仍然将它们放在一个库中,你怎么能这样做?

namespace MyAssembly.SomeApiInternals
{
     //Methods from this class should not 
     //be used outside MyAssembly.SomeApiInternals
     internal class Foo
     {              
          internal void Boo() { }
     }
}

namespace MyAssembly.AnotherPart
{
     public class Program
     {              
          public void Test() 
          {
               var foo = MyAssembly.SomeApiInternals.Foo();
               foo.Boo(); //Ok, not a compiler error but some red flag at least 
          }
     }
}             

如何限制类型/方法在相同程序集中被其他类型/方法使用但在此命名空间之外?

(我将自己给出一些答案,看看人们如何投票。)

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以将代码放在不同的程序集中,然后在构建后的步骤中将程序集与ILMerge合并......

答案 1 :(得分:2)

使用NDepend并输入体现所需内容的CQL规则,并将其作为构建的一部分运行。该语言对此级别的限制不感兴趣。 (我还没有关注你的链接 - 你真的试图在没有NDepend的情况下做到这一点吗?你的答案应该将其排除在外?)