2009-01-29 6 views
6

Ich habe ein Projekt, das Spring verwendet und ist in ein paar Dutzend DAOs und zugehörige DTOs aufgeteilt. Ich benutze JdbcTemplate, aber nicht viel mehr, da es genau die Ebene der Abstraktion ist, mit der ich zufrieden bin.Lazy Loading DTO Felder im Frühjahr

Ich führe gerade Lazy Loading auf meinen DTOs durch, indem ich einen ziemlich haarigen Code in ihre Getters lege.

Grund vorformulierten Logik ist: 1. Wenn das Feld nicht null Rückkehr seinen Wert und Ausgang ist 2. Kontakt entsprechenden DAO und holen relevant DTOs 3. Bewahren Sie sie bis zum nächsten Mal.

Es funktioniert gut, außer dass meine niedrigen DTOs sind mit einer ganzen Reihe von DAOs gekoppelt und sind nicht so POJOey.

Ein weiterer Code Geruch erscheint, wenn ich die Logik in der DAO platzieren, da es sowohl CRUD für seine DTOs und Lazy Loading behandelt, und wie ich es verstehe Objekte sollten eine einzige Verantwortung haben.

Ich hoffe, dass es einen relativ einfachen Spring-Ansatz gibt, mit dem ich ein Lazy Loader-Objekt zwischen den DAOs und den DTOs injizieren kann, um dies zu erreichen, aber jede andere Lösung würde für mich funktionieren.

Irgendwelche Ideen?

Antwort

4

Es ist einfacher, DAOs um DAOs herum zu wickeln ... es hängt davon ab, wie viel von dem Modell Sie mitbringen möchten. DTOs werden normalerweise nicht verwendet, um eine Eins zu vielen zu bringen, wie zwei oder mehr separate Datenbank/Dao-Aufrufe. In diesem Fall möchten Sie wirklich ein ORM. Da du nach einer Dao-Antwort suchst ...

Es gibt nichts, was dich davon abhält, DAO's miteinander zu verbinden, um dir ein einziges DTO zu geben. Es ist einfacher, ein DTO mit einem DAO zu verbinden. Es ist nicht wirklich eine Service-Schicht, es sind nur Bausteine ​​von DAO's. Sie könnten also eine PersonDao und eine TelephoneNumberDao haben. Eine Person kann mehr als eine Telefonnummer haben, so dass Sie auch PersonModelDao haben können, die PersonDao und TelephoneNumberDao unter der Haube verwendet, um ihre Arbeit zu erledigen.

Alternativ vermeiden Sie das ganze Problem und versuchen Sie nicht, die 1-N zwischen Person und Telefonnummer auf der DTO-Ebene abzubilden. Lassen Sie Ihre Benutzeroberfläche die richtigen Aufrufe an die richtigen DAOs machen. Ich mag das eigentlich besser, wenn ich DTOs benutze.

+0

Ich mag diese Antwort (+1) es ist eine Schande, die Klarheit von person.getTelephoneNumbers() zu verlieren –

3

Es ist üblich, eine Service-Schicht einzuführen, die Ihre DAOs umschließt und solche Probleme behandelt. Wenn Sie befürchten, dass Sie Ihren DTOs zu viel Standardcode hinzufügen, um die Lazy Loading-Funktion zu übernehmen, könnte die Verwendung von AOP eine Möglichkeit sein, dies zu erreichen. Vielleicht möchten Sie in AspectJ schauen und entweder zur Kompilierungszeit oder zur Ladezeit weben. Da Sie den Byte-Code direkt ändern würden, müssten Sie sich keine Gedanken über den Leistungsaufwand des proxybasierten AOP machen.