2010-09-27 16 views
15

Ist es möglich, eine einzige Klasse innerhalb von zwei Namensräumen zu haben und wie kann ich das tun?.NET Mehrere Namespaces für einzelne Klasse

Zur Klarstellung: Wir haben eine Klassenbibliothek (sagen wir Root-Namespace ist classLib1), die im Laufe der Zeit gewachsen ist (mehr Klassen) und ich möchte Klassen logisch in verschiedene Namespaces gruppieren. Allerdings müssen einige der älteren Klassen in diese neuen Namespaces (z. B. classLib1.section1) gruppiert werden, und dadurch wird Legacy-Code in anderen Assemblys, die diese Klassenbibliothek verwenden, beschädigt. Ich möchte also auf eine Klasse verweisen können, die beide Namensräume verwendet, bis wir die alten herausführen können.

Ich kann keine Informationen dazu finden, was darauf hindeutet, dass es einen Grund gibt, dass die Leute das nicht wollen!?!

+1

Warum nicht einfach refactorieren und die Referenzen in den Legacy-Baugruppen reparieren? –

+0

Ich möchte, aber nicht den anderen Code zu berühren - zu viel ist auf der Linie, wenn ein Fehler gemacht wird. –

+1

Dann sind Fassaden deine Freunde. – annakata

Antwort

20

Nein, es gibt keine Möglichkeit, einer einzelnen Klasse zwei Namen zu geben (der Namespace ist eigentlich nur ein Teil des Klassennamens).

Um dieses Problem zu umgehen, können Sie die Klassen an ihren neuen Speicherort verschieben und am alten Speicherort (Fassadenmuster) dünne Wrapper erstellen. Eine bessere Lösung wäre natürlich, die Klassen zu verschieben und den Legacy-Code entsprechend zu korrigieren.

+0

... würde vorschlagen, warum ich keine Informationen dazu finden kann - ist das damit zu tun, wie Name-Räume zu CLR kompilieren? –

+0

Verdammt, schlagt mich dazu :) – annakata

+0

Ich hatte überlegt, eine Fassadenschicht zu erstellen, aber ich wollte sehen, ob es eine einfachere Arbeit gibt. –

4

Als Arbeit um Sie können ‚mit‘ die Klasse in den zweiten Namespace, wenn Sie es brauchen:

namespace classLib1.section2 
{ 
    public myBigClass 
    { 

und in jeder Datei, die es in den alten Namespace verwendet man eine Zeile hinzufügen können

namespace classLib1.section1 
{ 
    using myBigClass = classLib1.section2.myBigClass; 

als vorübergehender Patch-up, bis Sie dies ordnungsgemäß behoben haben.

+0

Dies funktioniert wahrscheinlich nicht mit statischen Klassen (Erweiterungen). Ich meine, ich habe es getestet, aber ich konnte auf keine der Erweiterungsmethoden zugreifen. Ich musste dem Namespace auch eine Dummy-Klasse hinzufügen, um sie für den Rest der Anwendung sichtbar zu machen. – jahu

3

Type Forwarding wurde in .net 2.0 eingeführt, das bedeutet, dass Sie das TypeForwardedToAttribute Attribut verwenden können, um anzuzeigen, dass ein Typ, der in AssemblyX ursprünglich vorhanden war, jetzt in AssemblyY gefunden werden soll.

Ich bin ziemlich sicher, dass dies nur angemessen/anwendbar ist, wenn Sie in mehrere Baugruppen trennen, aber es ist wissenswert, auch wenn nicht.

Verwandte Themen