Ich mag die Idee, Schnittstellen und Implementierung getrennt zu haben. Aber wie getrennt? Sind die Schnittstellendefinitionen in einer separaten .Net-Assembly? Haben Sie ein einzelnes Projekt, das alle Schnittstellen für eine Lösung definiert? Gibt es sonst Probleme mit zirkulären Abhängigkeiten von Interfaces?Wo sollten Interfaces "physisch leben"?
Antwort
Versetzen Sie Ihre Domänenobjekte und Schnittstellen in eine separate "Domänen" -Assembly.
Diese Assembly sollte niemals auf etwas anderes als die Kern-.net-Assemblys verweisen.
Auf diese Weise erhalten Sie eine saubere Trennung von Ihrem Domain/Service-Modell und Ihrer Implementierung.
Edit:
http://jeffreypalermo.com/blog/the-onion-architecture-part-1/
würde ich nicht die Schnittstellen in eine separate Baugruppe setzen, nur um von ihm. Wenn die Schnittstellen jedoch an irgendeiner Form der IPC- oder Erweiterbarkeitsarchitektur teilnehmen, ist es oft sinnvoll, ihnen eine eigene Assembly zu geben.
Wenn Sie Projekte, die sich gegenseitig referenzieren müssen, dann ja, erhalten Sie eine separate Baugruppe für die Schnittstellen benötigen, aber Sie sollten sorgfältig auch Architektur untersuchen, um zu sehen, ob eine andere Art und Weise gibt es die zyklische Abhängigkeit zu lösen.
Ich bevorzuge die gängigsten oder einfachsten Implementierungen der Schnittstelle in einem Unterordner (und Namespace) nach dem Namen der Schnittstelle.
\project\ \project\IAppender.cs \project\Appender\ \project\Appender\FileAppender.cs \project\Appender\ConsoleAppender.cs
Wenn ich diese Klasse außerhalb des Projekts erweitern. Wiederholen Sie in einem speziellen Projekt die Ordner/Namespace in ähnlicher Weise.
In dem Projekt, an dem ich gerade arbeite, gehen die Schnittstellen und die zugehörigen Basisklassen in Baugruppen ein, die logisch unter Funktionen aufgeteilt sind. Die Implementierungen dieser Anbieter und Klassen werden in eine Kernbaugruppe integriert. Die Idee ist, dass Leute, die unsere API verwenden, auf mehr oder eine der API-DLLs in einer klaren und logischen Weise verweisen können.
Kleinere Anwendungen benötigen diese Art der Trennung nicht. Aber egal, wo ich die Schnittstellen aufbewahre, ich würde sie im selben Namespace behalten wie jede Basisklasse.
Ich dachte, es lohnt sich, einen Link zu Jeffery Palermo ausgezeichneten Artikel auf der Zwiebel-Architektur http://jeffreypalermo.com/blog/the-onion-architecture-part-1/ –
Vielen Dank. Dieser Artikel erklärt das Konzept sehr gut. –