Frage

Kurze Frage: Wäre es eine gute oder eine schlechte Idee, um meine Domain-Driven Design-Stil-Repositories als Singletons zu implementieren? Warum?

Oder sollte ich vielleicht eine Abhängigkeit Injektors Behälter verwenden, um meine Repositories zu verwalten und entscheiden, ob sie Singletons sind oder nicht?

Ich lese immer noch DDD schnell , und möchte einige gute Repository Beispiele sehen.

War es hilfreich?

Lösung

Ich habe ein paar Möglichkeiten gesehen, dies zu tun.

Die gängigste Methode ist Dependency Injection zu verwenden, um die Repositories in die Objekte zu injizieren, die sie verwenden. Normalerweise sind diese Moderator oder Controller-Klassen, aber in einigen Fällen das Modell ruft in das Repository. Normalerweise ist es besser, wenn Sie dies vermeiden. Wenn Sie einen di-Container verwenden können, dies zu tun, dann gehen für sie.

Sie können auch die Repositories machen das Singletonmuster implementieren. Ich würde versuchen, dies zu vermeiden, weil Singletons in der Regel statische Methoden verwenden. Dies kann den Code machen zu testen, die in die Singletons schwieriger nennt. Wenn Sie die Dinge auf diese Weise zu tun haben, dann stellen Sie sicher, dass Sie den Code trennen, die die Singleton Anrufe und verwenden „manuell“ Dependency Injection die Singletons in die Klassen zu injizieren, die sie nennen. Dies wird von einigen der engen Kopplung befreien Sie würden sonst bekommen.

Ich habe einige Beispiele gesehen, wo die Repositories nie aufgerufen. Wenn jemand das Objekt Diagramm im Modell navigiert und fordert ein Objekt, das das Modell geladen isnt wirft nur ein Ereignis und das Repository reagiert auf dieses Ereignis. Auf diese Weise gibt es keine Anrufe in das Repository und es vollständig aus dem Modell entkoppelt. Ich havn't diese Architektur selbst verwendet, aber es scheint sehr sauber.

Andere Tipps

Verwenden des Dependency Injection Container, um zu entscheiden, wie und wo Repositories erstellt werden.

Durch die Verwendung von

UserRepository.Instance.Find(userId);

Sie sind ein Hindernis für die Prüfung zu schaffen.

Wenn Ihre Repositories in Dienste übergeben werden Constructor Injection verwenden, dann können Sie auch ersetzen sie leicht mit Mocks.

Ich bin nicht sicher über diese und ich habe das gleiche Problem. Ich denke, dass Sie ein Repository ein Singleton machen sollte, wenn die Objekte, die es funktioniert mit häufig verwendet werden. Und dass es nicht einen Singleton gemacht werden, wenn man Gegenstände verwenden, die es mit selten funktioniert, weil das Repository eine Menge Speicher für Objekte nehmen würde und vielleicht wäre es nur einmal und nie wieder während der Nutzung der Anwendung aufgerufen werden. Wie gesagt, das ist nicht richtig denken sein kann.

Lets sagen, ich habe wirklich großes Projekt, und ich möchte neuer Dienst hinzuzufügen kann sagen, dass es einig Hardware-Vertreter in meinem System sei. Ich mag diesen Service durch viele Klassen zugänglich sein, ich will sicher sein, dass es nur eine Instanz des Dienstes oder die Schicht, die den Zugriff auf Service kontrollieren. Injizierenden diesen Service durch alle meine System (200+ Klassen) würde viel Arbeit sein. Für mich ist „Singleton“ oder einem „Service Locator“ passt gut für diese Aufgabe.

Soweit ich die Domain verstehen enthält nur ein Repository-Schnittstellen, was bedeutet, dass es viele Repository-Implementierungen für eine einzige Schnittstelle sein kann. So ein Repository kann sicherlich nicht eine statische Klasse sein, da Sie nicht statische Methoden in einer Schnittstelle definieren. (Anmerkung:. In einigen Sprachen, die Sie statische Methoden in einer Schnittstelle definieren, aber es macht nicht viel Sinn für mich)

Aufbewahrungsorte sind in der Regel über die Synchronisierung der Einheiten mit Datenbanken, Dateien, etc .. so dass sie nicht stabil Abhängigkeiten. Was bedeutet, dass sie nicht Singletons kann nur Umgebungs Abhängigkeiten sein kann. Hier ist ein Artikel darüber rel="nofollow. Der lustige Teil sogar die Autoren sagen, dass Sie Singletons in Ihrer Domain verwenden können.

Zu meinem Verständnis ist es viel sauberer, um ein Repository zu machen, der sicherstellt, dass Sie nur eine einzige Einheit statt vieler. Das ist die resposibility des Endlagers, nicht das Unternehmen, wenn Sie Ihren Code wollen das einzige Prinzip Verantwortung gerecht zu werden .

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