How to organise namespaces within an assembly to reflect design
<p>I would like to organise my assembly so the code that I write reflects my intended design. From help I already received I understand that namespaces are the principal way to organise types to achieve this.</p>

<p>The issue I have is that my assembly, <code>Assembly</code>, say, uses a layer of implementation classes. However some of the classes in <code>Layer1</code> are themselves part of the implementation of <code>Layer1</code> and I'd like to reflect that in the way I structure my code. My first thought was to try to make some classes in <code>Layer1</code> private, but I can see that <a href="http://stackoverflow.com/questions/1223873/namespace-only-class-visibility-in-c-net">this is not possible</a>.</p>

<p>Logically, <code>Layer1</code> is exposing classes <code>A1</code>, <code>B1</code>, <code>C1</code> etc. And it uses classes <code>A2</code>, <code>B2</code>, <code>C2</code> etc.</p>

<pre><code>namespace Assembly.Layer1
{
    // "interface to Layer1"
    class A1 // ...
    class B1 // ...
    class C1 // ...
    // "implementation of Layer1"
    class A2 // ...
    class B2 // ...
    class C2 // ...
} // (one file per class)
</code></pre>

<p>It seems like one way to address this is to put <code>A2</code>, <code>B2</code>, <code>C2</code> etc into a new namespace, <code>Assembly.Layer1.Layer2</code>. Then, when I'm writing code in the top-level namespace and using <code>Assembly.Layer1</code>, intellisense only shows me the classes that <code>Assembly.Layer1</code> exposes. Also, <em>by convention</em>, I should only refer one layer down in the namespace hierarchy at a time. Is this the right approach?</p>
