| 

.NET C# Java Javascript Exception

2
Mahlzeit zusammen,

angenommen man hat eine Klasse/Interface für Logging-Funktionen. Diese existiert aber in zwei Assemblies, einer fremden und einer eigenen. Die Fremd-Library möchte man wegen ganz anderer Dinge benutzen, nicht unbedingt wegen des Loggings.

Wenn das Interface bzw. die Klasse nun in beiden Assemblies die gleiche Bezeichnung trägt UND man in der aktuelellen Klasse beide Libraries über using referenziert (weil man aus beiden eben Methoden benutzen möchte), ergibt sich das Problem, das man eben nicht einfach nur schreiben kann
ILogger logger  = null;

Stattdessen muss man dann doch den Namespace mit angeben
MeineAssembly.Logging.ILogger logger  = null;


Ich finde das etwas unschön. Eine mögliche Lösung wäre Folgende
using ILogger = MeineAssembly.Logger.ILogger;
ILogger logger = null;


Jetzt meine Frage: Lässt sich das Assemblyweit einstellen? Es wäre doch schöner, als wenn man diese Using-Anweisung in fast jeder Klasse hätte.

Umbennenen der eigenen Klassen/interfaces wäre auch nicht wirklich toll, denn ich wüsste keine bessere Bezeichnung als z.B. IEventAggregrator. Und es ist halt ärgerlich, wenn man eine MVVM-Library benutzt, aber dort ein paar Klassen eben selbst implementieren möchte. Dann stösst man alle Nase lang auf dieses Problem.
News:
27.04.2012
Jens Duczmal 2,6k 1 3 9
1 Antwort
1
Die Namespaces wurden ja gerade deshalb eingeführt, um Namendskonflikte umgehen zu können und das Konstrukt "using xxx = yyy" ist der Komfort, nicht bei jeder Referenz den vollen Namespace angeben zu müssen. Für C# gibt es meines Wissens keine Möglichkeit, Usings projekt- oder solution-weit zu definieren (VB kann das zwar generell, aber ob dein Problem damit gelöst werden kann, kann ich nicht sagen).

Abgesehen davon, dass ich nicht verstehen kann, warum es ein Problem sein soll, in jeder Klasse anzugeben, welche Namespaces referenziert werden gibt es mehrere Lösungen:

  • Generell hast du die Möglichkeit, alle öffentlichen Schnittstellen und Klassen der Dritt-Library mit einer eigenen Implementierung zu versehen. Das würde ich allerdings nicht empfehlen da dies zu Verwirrungen führen kann.
  • Du kannst eine Wrapper-Klasse schreiben, welche als Mediator agiert und nur die Funktionen der Dritt-Library, welche du verwenden willst, öffentlich sichtbar macht. Wenn du diese Klasse in ein eigenes Projekt packst, musst du die Dritt-Library auch nur dort referenzieren.
  • Du kannst natürlich auch deine eigenen Klassen umbenennen.


Wenn du partout deine eigenen Klassen nicht umbenennen willst, empfehle ich dir die zweite Lösung, da sie am wenigsten aufewndig zu implementieren ist.

Gruß
Klaus
28.04.2012
luedi 2,2k 1 9

Stelle deine Interface-Frage jetzt!