Frage

ich eine Episode von Bob Martin bei NDC gerade fertig zu beobachten, wo er diese Richtlinien in C # am Anfang einer Seite „mit“ schlecht sind wegen der engen Kopplung schaffen sie / implizieren zwischen den Komponenten.

Welche Art und Weise gibt es externe .dlls zu verwenden, ohne einen Projektverweis und eine using-Anweisung hinzufügen?

Ich erinnere mich V6 zu lassen verwendete man ein Objekt durch die Zeichenfolge des ProgId zu schaffen - ich bin nicht sicher, das ist die Technik, die ich suche, aber es ist ein Beispiel für eine Sprache, die nicht einen Projektverweis brauchte um eine dLL zu verwenden.

EDIT: Hier ist ein Link zu der Konferenz . Leider habe ich nicht die genaue Zitat oder Minute im presenation, ich werde durch den Speicher.

War es hilfreich?

Lösung

Es ist nicht die Anweisung using selbst, das ist schlecht -. Es ist, wenn Sie erhalten zu viele von ihnen

Eine Aussage wie using System; ist selten ein Problem an sich, aber wenn Sie viele haben (ich würde sagen, mehr als 3-6, je nachdem, welche sind) in der gleichen Code-Datei, könnte es ein sein Hinweis die enge Kopplung .

Sie könnte genauso gut eine ähnliche Faustregel auf die Anzahl der Referenzen in einem Projekt selbst anwenden.

Die Lösung enge Kopplung ist Programmierschnittstellen und Dependency Injection (DI).

Die ProgId Art und Weise, Dinge zu tun, die Sie von VB erinnern können, waren einfach COM in Aktion. Im Wesentlichen verwendet man, dass ProgId einen Verweis auf eine Instanz zu erhalten, die die gewünschte Schnittstelle implementiert. Der Nachteil war, dass dies nur funktioniert, wenn das COM-Objekt wurde allgemein registriert. Denken Sie daran, dll Hölle?

Sie können immer noch nach dem gleichen Prinzip und bestimmten Aromen DI gelten, nur dass jetzt die Schnittstelle ist ein .NET-Typ und nicht in IDL definiert ist, und Sie brauchen eine Art von DI Containern, die konkrete Umsetzung zu liefern.

Andere Tipps

ich glaube, Bob Martin tatsächlich bezieht sich die späte Bindung zu früh gegenüber.

In .NET späte Bindung ist möglich, durch Reflexion und insbesondere die Activator-Klasse, die Schaffung eines Typs in einer externen Baugruppe mit einem Dateinamen oder Namen der Assembly ermöglicht.

Normalerweise Richtlinien (nicht die Anweisung using) gehen Hand in Hand mit direkt eine externe Montage verweisen. dh. Sie fügen Sie einen Verweis auf eine Assembly und dann Richtlinien hinzufügen, indem um zu vermeiden, die vollständige Namespace-Hierarchie zu geben, wenn Sie die externen Typen verwenden.

Also, wenn Sie Ihren Code hat eine große Anzahl von Direktiven Using an der Spitze zu finden, ist es möglich, dass Sie viele andere Arten direkt und so eine Erhöhung der Kupplung / Abhängigkeit des Codes auf dieser Art verweisen.

Ich würde vermuten, das ist, warum Bob sie so schlecht bezieht. Die Antwort auf die Frage: „Ist dies wirklich schlecht?“ ist ein sehr subjektiv und kontextabhängig ein.

Im Allgemeinen jedoch, Entkoppelung von Bauteilen ist fast immer ein gutes Ziel für bei der Gestaltung Software zu zielen. Dies liegt daran, es erlaubt Ihnen, Teile des Systems mit minimalen Auswirkungen auf den Rest des Systems zu ändern. Nachdem ein oder zwei von Bob Martins Bücher lesen, würde ich erwarten, das ist, was er ist immer an.

using zu Namespaces nur eine Verknüpfung ist, sind sie nicht Verweise auf externe Dateien. Daher ist dies einfach nicht wirklich Sinn.

Wie auch immer, was man tun kann, ist eine Schnittstelle DLL (eine DLL mit nur Schnittstellen), so dass Sie dynamisch laden und verschiedenen Baugruppen verwenden und Typen erstellen (durch Reflexion), die Sie zu den bekannten Schnittstellen werfen können. Dies ist der richtige Weg, externe Referenzen der Lockerung, während die Vorteile der stark typisierte Sprache zu halten und die frühe Bindung.

Haben Sie einen Blick auf die Assembly und AppDomain Klassen Baugruppen zu laden, und Activator Typinstanzen mit Namen zu erstellen.

Sie könnten Reflexion verwenden:

// Load the assembly
Assembly assembly = Assembly.LoadFrom(@"c:\path\Tools.dll");
// Select a type
Type type = assembly.GetType("Tools.Utility");
// invoke a method on this type
type.InvokeMember("SomeMethod", BindingFlags.Static, null, null, new object[0]);

Sie können tun, was Sie durch Reflexion beziehen. Sie können die Baugruppe zur Laufzeit laden, und beziehen sich durch sie die Klassen usw. zu erhalten und sie dynamisch nennen.

Ich persönlich würde dies aber nicht tun, um Kopplung zu vermeiden. Für mich ist das eine schlechte Nutzung der Reflexion, und ich würde viel lieber fügen Sie es dem Projekt und darauf verweisen, es sei denn es einen bestimmten Grund, warum dies nicht zu tun. Reflexion fügt Overhead für das System, und Sie nicht den Vorteil der Kompilierung Sicherheit bringen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top