Frage

Ich bin in einem großen Dilema. Ich arbeite an einer hochmodularen Web -App in ASP.NET MVC 2 (in der Tat wird Core super leicht sein, alle funktionieren auf Modulen/Plugins). Ich fand MEF ziemlich nützlich für Module Discovery, aber ich möchte es nicht als IOC -Container. Es besteht ziemlich gute Chancen, dass ich fortgeschrittene Funktionen des "echten" IOC -Containers benötige, daher möchte ich Einheit verwenden.

Und hier ist das Problem: Wie können Module Container konfigurieren (programmatisch) = Registrieren Sie ihre eigenen Typen (MVC -Controller, benutzerdefinierte Implementierungen von Diensten ...) bei der Anwendung, ohne in allen Modulen eine harte Abhängigkeit von der Einheit zu machen? Ich kenne das Common Service Locator -Projekt, und es scheint ziemlich gut zu sein, aber dieser Schnittstellen -Co -Container erlaubt nur Auflösungsarten, nicht registrieren (AFAIK).

Ich hoffe wirklich, dass Sie meinen Standpunkt verstehen können, ich weiß, mein Englisch ist schrecklich (ich komme aus nicht englischsprachigem Land :) Vielen Dank!

War es hilfreich?

Lösung

Ich kann mit Sicherheit damit sympathisieren, MEF nicht als DI-Container zu verwenden, aber ich denke, Sie sollten immer noch überlegen, ob dies möglicherweise nicht für Ihre Add-Ins anwendbar ist.

Du Erfordern Sie bereits, dass Ihre Add-Ins MEF verwenden, Sie werden alle harte Abhängigkeiten davon haben. Obwohl ich persönlich den hart codierten, attributbasierten Ansatz von MEF nicht mag, klingt es so, als ob Sie fragen, wie sich jedes Add-In mit dem DI-Container registrieren kann. Das klingt auch für mich nach hartem Koppler, also könnten Sie MEF genauso gut in den ganzen Weg verwenden.

MEF -Attribute anwenden ist Komponentenregistrierung.

Wenn Sie MEF wirklich nicht verwenden möchten, haben Sie nur ein paar andere Optionen (keiner davon besonders attraktiver):

  • Erfordern Sie alle Add-Ins, auch eine harte Abhängigkeit von der Einheit zu haben. Ich verstehe vollkommen, warum Sie dies nicht tun möchten, aber ich füge nur diese Option für die Vollständigkeit ein
  • Erfordern Sie alle Add-Ins, um auch eine harte Abhängigkeit vom gemeinsamen Service-Locator zu nehmen. Meiner Ansicht nach verschiebt das Problem nur geringfügig.
  • Definieren Sie Ihre eigene Add-In-Registrierungsschnittstelle dass alle Add-Ins implementieren müssen. Sie können dann Ihre eigene Implementierung schreiben, die Einheit verwendet, damit sich alle Add-Ins an dieser Schnittstelle registrieren, aber dann mehr oder weniger nur die Funktionen von MEF duplizieren.
  • Schreiben Sie alle Add-Ins in a Di-freundlich, aber Container-agnostisch Stil. Dadurch bleibt das Problem bei der Konfiguration des DI -Containers, und Sie müssen dann auf die XML -Konfiguration zurückgreifen. Das ist ein sehr spröde sich nähern und kann schnell dazu führen Hölle aufrechterhalten, Ich füge also noch einmal diese Option aus, um die Vollständigkeit willen.

Die Verwendung von MEF für Add-INs schließt Sie nicht daran hin, Einheit in Ihrer Kernanwendung zu verwenden, aber ich verstehe, dass es sehr leicht ist, dass dies möglicherweise nicht viel Sinn macht.

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