Frage

Gegeben ein Codeprojekt, das dem SoC-Prinzip entsprechen soll, indem lose gekoppelte Schichten implementiert werden, ein IoC-Container usw. vorhanden ist. zum Beispiel eine einfache ASP.NET MVC-Lösung, die in die folgenden Assemblys unterteilt ist:

  • Anwendung assembly + Namensraum
  • Modell assembly + Namespace (enthält ein konkretes Repository für den Zugriff auf DB-Daten)

und wo ein Betonlager in der Modell assembly muss eine gemeinsame Schnittstelle implementieren IMyBusinessRepository, in welche Baugruppe würden Sie diese Schnittstelle einfügen?

1) Wenn Sie diese Schnittstelle in die Modell assembly, die Chancen stehen gut, dass es unmöglich wäre, diese Assembly durch eine andere zu ersetzen (zumindest wenn sie einen anderen Namespace hat), ohne den Code der zu ändern Anwendung Versammlung.Auch eine Alternative IMyBusinessRepository eine Implementierung, die sich in einer anderen Assembly befindet, müsste auf die ursprüngliche Assembly verweisen (Argh!)

2) Wenn Sie es in die Anwendung montage wäre es unmöglich, die zu verwenden Modell montage in anderen Projekten ohne Bezugnahme auf die Anwendung versammlung (Argh!)

3) Oder würden Sie eine separate gemeinsame Baugruppe nur für diese Schnittstelle und für jede gemeinsame Schnittstelle oder jeden Satz von Schnittstellen erstellen?(Ah?)

Zusammenfassen, X die Baugruppe sollte in der Anwendung leicht austauschbar sein A (lediglich durch Ändern einer Referenz) und in Anwendungen wiederverwendbar B, C, D.

War es hilfreich?

Lösung

Möglichkeit 3.

Das Einfügen der Schnittstellendefinitionen in den aufrufenden Code ist in Ordnung, bis Sie gegen die Schnittstellen entwickeln möchten, aber nicht gegen die Komponente, die sie enthält (angenommen, Sie möchten einen Datenzugriffsanbieter erstellen, aber Sie möchten nicht das ganze einbinden Website-Projekt).Es mit einer Implementierung zu versehen, ist einfach verrücktes Gerede :)

würden Sie eine separate gemeinsame Baugruppe nur für diese Schnittstelle und für jede gemeinsame Schnittstelle oder jeden Satz von Schnittstellen erstellen?(Ah?)

Ich würde Schnittstellen in separate Baugruppen gruppieren, indem ich über Folgendes nachdenke Gemeinsame Schließung und Gemeinsame Wiederverwendung Grundsatz.Indem sie alleine sind, werden sie auch sein stabil.Denken Sie über die Szenarien nach, in denen sie verwendet werden - macht es Sinn, sie zusammenzuhalten - wenn ja, dann sind sie wahrscheinlich in einer Baugruppe in Ordnung.

Andere Tipps

Sie könnten einfach eine Vertrags- oder Schnittstellenassembly verwenden, wie Sie vorgeschlagen haben.

Wenn Sie jedoch bedenken, dass Sie versuchen, mit-in the separation of concerns principal zu arbeiten, erwarten Sie, dass Sie alle Implementierungen aller Ihrer Schnittstellen gleichzeitig ersetzen, oder vielleicht nur eine einzige konkrete Implementierung hier und da.

Wenn Sie erwarten, alle zu ersetzen, ist möglicherweise eine separate Assembly am besten, andernfalls könnten Sie einfach die Ersatzimplementierung in der Modellassembly neben der vorhandenen Implementierung durchführen und die Schnittstellen werden auch in der Modellassembly deklariert.

Ich würde empfehlen, Schnittstellen entweder in einer separaten Baugruppe oder in der Nähe ihrer Implementierung innerhalb derselben Baugruppe zu platzieren.Es sollte immer mindestens eine Implementierung der Schnittstelle zusammen mit der Schnittstelle selbst geben.Ein üblicher Ansatz besteht darin, Schnittstellen in derselben Assembly in einem separaten Ordner zu platzieren.

SoC ist ein logisches Konzept, das Sie in ein physisches zu übersetzen versuchen.

Der einzige nachteilige Effekt beim Einfügen Ihrer Repositorys in das Modell ist, dass es in Zukunft möglicherweise schwierig sein wird, Assemblys auszutauschen.Ich verstehe diese Sorge nicht?Vielleicht dringen Außerirdische ein und wir müssen die galaktische Zeit in unsere Datenbanken aufnehmen.Sollten wir diese Abstraktion jetzt codieren?Wahrscheinlich nicht.

Ich verstehe die Sorge auch nicht.Was hindert dich daran Concrete1 : IRepository und Concrete2 : IRepository in der Modellmontage?

Außerdem koppeln Sie wahrscheinlich etwas falsch, wenn der Kern Ihrer Anwendung durch eine Änderung Ihrer Modellklassen geändert werden muss.Das ist ein bisschen rückwärts.

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