In der Vergangenheit waren meine Projekte schwer zu verwalten, besonders wenn ich nach ein paar Jahren noch einmal nacharbeiten musste, um einen Teil neu zu schreiben oder zu aktualisieren, ohne alles neu machen zu müssen. Dieses Mal konzentriere ich mich darauf, es einfach zu machen und ein "steckbares" Anwendungsdesign zu erstellen, das es mir ermöglicht, einen Teil neu zu betrachten und zu wiederholen, ohne alles zu berühren.
Ich denke an diese Struktur:
Ich möchte also in der Lage sein, mit Bounded Context 2 zu arbeiten und diesen mit vielen neuen Funktionen in den kommenden Monaten / Jahren zu erweitern, während Bounded Context 1 unverändert belassen wird. Ich werde auch an der Benutzeroberfläche arbeiten, insbesondere an den Teilen, die sich auf Bounded Context 2 beziehen. Ich möchte Benutzern auch die Möglichkeit geben, mit dem begrenzten Kontext 2 von anderen Geräten zu arbeiten.
Vorzugsweise werden sogar die im UI von bounded context 2 verwendeten Webtechnologien aktualisiert, da dies unser Hauptaugenmerkbereich ist und am meisten genutzt wird, so dass es sogar schlau sein könnte, das in ein eigenes UI-Projekt für das Web und eine "Landing" -Site haben, die allgemeine Funktionen wie das Verwalten von Benutzern und das Anmelden von Benutzern bietet.
Momentan denke ich darüber nach, das alles in separate Lösungen in Visual Studio zu trennen, um das Management zu vereinfachen. Aber ich könnte einen Ordner für jede in einer Lösung machen und alles dort hinstellen.
Meine Frage ist, was ist der empfohlene Weg, dies zu tun, und was sollte ich beachten, bevor ich mich in verschiedene Lösungen aufspreche?
Gibt es Best Practices für die Verwaltung? Jeder mit Erfahrung was funktioniert und nicht?
Übrigens: Da dies durch beschränkte Kontexte geteilt wird, muss Kommunikation zwischen Teilen des Systems stattfinden, obwohl keine direkte Abhängigkeit besteht (dh Kontext 1 verwaltet und pflegt Geschäftslogik für die Registrierung von Mitarbeitern, die wiederum in Kontext 2 benötigt werden) / p>
Aktualisieren Ich weiß, dass weitere Informationen benötigt werden.
Es gibt mehr beschränkte Kontexte als diese beiden. Keiner von ihnen ist wirklich wie eine Abteilung, d. H. Mitarbeiterverwaltung ist der Kontext, in dem sich Manager befinden, wenn sie Informationen in Bezug auf die Verwaltung anderer organisieren / archivieren müssen und auch an wichtige Ereignisse erinnert werden müssen. Der Einkauf ist der Kontext, in dem sich die Mitarbeiter befinden, wenn sie Waren für eine Abteilung kaufen und Inventar anlegen. Es könnte 20-40 Organisationsabteilungen geben, die dies nutzen. Ich überlege, ob "Reporting" ein separater beschränkter Kontext ist (allerdings ohne sehr interessante Logik und Verhalten). Diese neigen dazu, klein zu beginnen, grundlegende Funktionalität bereitzustellen, und dann mit der Zeit zu wachsen, wenn mehr Funktionalität hinzugefügt wird und die Leute neue Bedürfnisse "entdecken". Sie werden separat aktualisiert, und ich hoffe, dass einige von ihnen rechtzeitig zu größeren Systemen heranwachsen werden, obwohl sie damit beginnen, eher grundlegende Bedürfnisse zu lösen.
Sie haben also einen Haufen Code und möchten an einem Teil des Codes arbeiten, ohne Projekte zu laden, die zu anderen Teilen gehören. Dann ja, Sie können jedes Teil als separate Visual Studio Lösung haben.
Entscheidend ist, dass die VS-Lösung nur eine [.sln] -Datei ist, die beschreibt, welche Projekte nach dieser Lösung gruppiert sind. Erstellen Sie keine separaten Kopien von Projekten nur für diesen Zweck. Sie müssen alle Projekte nur einmal verwalten (jeweils eine Kopie) und dann separate Lösungen erstellen und Projekte einschließen, von denen Sie denken, dass sie mit dieser Lösung (diesem Teil des Codes) zusammenhängen.
z.B. Sie könnten entscheiden, dass "Employee Management" eine Lösung ist, die aus nur 3 (aus dem ganzen Haufen von 40) Projekten besteht. Dann gehen Sie voran und erstellen Sie eine Lösung, die diese drei Projekte enthält. Wahrscheinlich werden Sie am Ende separate kleinere Lösungen haben, die bequem in der Trennung von anderen arbeiten.
Sie können auch eine große Lösung mit allen darin enthaltenen Projekten in Betracht ziehen (wiederum jedes Projekt hat nur eine Instanz, kann aber Teil mehrerer Lösungen sein ). Diese Art von großer Lösung kann für wichtige Operationen wie Build / Release Vorbereitung nützlich sein.
Ich vermute, dass Sie versuchen, die Bedeutung einer Lösung zu übertreiben. In Wirklichkeit ist der gesamte Code, den Sie haben, eine riesige Einheit, weil sie sich gegenseitig referenzieren und wahrscheinlich nicht gebaut werden können, ohne andere neu zu kompilieren. Auch wenn Sie versuchen, die Lösungsstruktur zu finden, die Ihren Geschäftsanforderungen entspricht, scheint es dennoch eine andere Richtung eines Problems zu sein, das nicht mit Lösungen zu tun hat. Das kann etwas wie die Lösung eines Problems der Aufteilung in Baugruppen, dynamisches Laden und Erweiterbarkeit usw. sein.
Fazit: Split-Code in Lösungen abhängig von der Bequemlichkeit, die Sie bei der Arbeit mit dem Quellcode erreichen wollen, weil das einfach die Quelle in Unterteile unterteilt, nichts mehr.
BEARBEITEN / Hinzufügen:
Sie können auch entscheiden, die Lösung in unabhängige Lösungen aufzuteilen, aber das ist etwas anderes. Das würde bedeuten, dass die Lösungsprojekte nur auf die Ausgabedateien (dll, exe) anderer Projekte in anderen Lösungen verweisen können. Das könnte gemacht werden, wenn jede Lösung eine andere wie einen Code von Drittanbietern behandelt (keine direkten Projektreferenzen, sondern nur Referenzausgaben).
Ich denke, wenn Sie entscheiden, ob Sie mehrere Lösungen haben sollten, ist die Antwort wirklich Sie stellen sich eine (oder mehrere) der Baugruppen, die Ihren begrenzten Kontext in anderen Anwendungen verwendet werden, die einige der Genau dieselben Anwendungsfälle, die Ihr beschränkter Kontext verwaltet. Wenn das der Fall ist, macht eine separate Lösung Sinn. Aber wenn alle Ihre UI-Ebenen konzeptionell dieselbe Anwendung zur gleichen Zeit haben, würde ich sie in einer einzigen Lösung behalten, es sei denn, Sie haben so viele Projekte, dass Visual Studio unbrauchbar wird.
Ich wäre jedoch überrascht, wenn Sie wirklich eine andere Anwendung verwenden würden, die den gleichen beschränkten Kontext verwendet. Wenn Sie darüber nachdenken, möchten Sie vielleicht eine neuere Version der Logik, die NUR für Ihren Webdienst bereitgestellt wird, aber nicht für Ihre Windows Forms-Anwendung? Wahrscheinlich nicht, da die Logikänderungen seltsame Probleme einführen können, bei denen die Daten nicht das sind, was eine Anwendung erwartet.
Was Sie haben klingt wie eine Plattform, und alle Teile (UI-Ebenen) dieser Plattform sollte sollte genau die gleiche Logik ausgeführt werden.
Die Lösung Sicht ist nicht das Hauptproblem, denke ich. Ich würde wählen, meine Projekte in Ordnern zu organisieren. Eins für jeden begrenzten Kontext und das Web-UI in einem anderen (es könnte als eigener begrenzter Kontext gedacht werden, wenn man darüber nachdenkt).
Sie könnten einen freigegebenen Kernel haben, der von allen Ihren bc geteilt wird, den Sie vielleicht auch in einen anderen Ordner legen könnten.
Normalerweise sollte jeder bc unabhängig sein (mit Ausnahme der gemeinsam genutzten Assemblys), und Ihre UI sollte nur über ihre Schnittstellen (z. B. den WCF-Vertrag) die bc kennen
Die globale Lösung enthält möglicherweise alle Ordner und die darin enthaltenen Projekte (MyApplicationName.sln). Sie könnten jedoch eine dedizierte Lösung nur für einen Teil der Lösung verwenden, wie MyApplication_BCName nur mit dem Ordner bc, den gemeinsam genutzten Assemblys und der Benutzeroberfläche wenn es Ihren Bedürfnissen entspricht und Sie keine große Lösung haben wollen.
Beginne klein, mach Dinge, sobald du sie wirklich brauchst. Seien Sie besonders vorsichtig bei den Querverweisen, die Art und Weise, wie die Dinge in vs eingerichtet werden, ist wirklich bedeutungslos. Wenn Baugruppen lose gekoppelt sind, können Sie sie später jederzeit neu anordnen.
Ich bin kein erstklassiger Programmierer, ich habe zufällig gedacht, dass Dinge wie diese für die neuesten Projekte, an denen ich beteiligt war, gut zu funktionieren scheinen, sie könnten in ein paar Monaten (Stunden ... ??) komplett verändert sein. ;))
Tags und Links c# visual-studio design-patterns architecture domain-driven-design