Vzory DAO vs Repository
Implementácie úložiska a DAO sa často považujú za zameniteľné, najmä v aplikáciách zameraných na dáta. To vyvoláva zmätok v ich rozdieloch.
V tomto článku si rozoberieme rozdiely medzi vzormi DAO a Repository.
2. DAO vzor
Vzor objektu prístupu k dátam, aka DAO vzor, je abstrakcia vytrvalosti údajov a považuje sa za bližšie k základnému úložisku, ktoré je často zamerané na tabuľky.
Preto sa v mnohých prípadoch naše DAO zhodujú s databázovými tabuľkami, čo umožňuje priamejší spôsob odosielania / načítania údajov z úložiska a skrýva tak škaredé dotazy.
Poďme preskúmať jednoduchú implementáciu vzoru DAO.
2.1. Používateľ
Najskôr si vytvorme základné Používateľ trieda domény:
verejná trieda Používateľ {private Long id; private String userName; private String meno; súkromný reťazcový e-mail; // zakladatelia a zakladatelia}
2.2. UserDao
Potom vytvoríme UserDao rozhranie, ktoré poskytuje jednoduché operácie CRUD pre Používateľ doména:
verejné rozhranie UserDao {void create (užívateľský užívateľ); Čítanie používateľom (Long id); void update (Užívateľský užívateľ); void delete (String userName); }
2.3. UserDaoImpl
Nakoniec vytvoríme UserDaoImpl trieda, ktorá implementuje UserDao rozhranie:
verejná trieda UserDaoImpl implementuje UserDao {private final EntityManager entityManager; @Override public void create (Používateľ používateľa) {entityManager.persist (používateľ); } @Override verejné čítanie používateľa (dlhé ID) {návrat entityManager.find (User.class, id); } // ...}
Tu sme pre jednoduchosť použili JPA EntityManager rozhranie pre interakciu s podkladovým úložiskom a poskytnutie mechanizmu prístupu k údajom pre Používateľ doména.
3. Vzor úložiska
Podľa knihy Erica Evansa Dizajn riadený doménami, „Úložisko je mechanizmus na zapuzdrenie správania pri ukladaní, načítaní a vyhľadávaní, ktorý emuluje kolekciu objektov.“
Rovnako podľa Vzory architektúry podnikových aplikácií, to „Sprostredkováva medzi doménou a vrstvami mapovania údajov pomocou rozhrania podobného kolekcii pre prístup k objektom domény.“
Inými slovami, úložisko tiež pracuje s údajmi a skrýva dotazy podobné DAO. Sedí však na vyššej úrovni, bližšie k obchodnej logike aplikácie.
V dôsledku toho môže úložisko použiť DAO na načítanie údajov z databázy a na vyplnenie doménového objektu. Alebo môže pripraviť údaje z doménového objektu a odoslať ich do úložného systému pomocou DAO na pretrvanie.
Poďme preskúmať jednoduchú implementáciu vzoru úložiska pre Používateľ doména.
3.1. UserRepository
Najskôr vytvorme UserRepository rozhranie:
verejné rozhranie UserRepository {User get (Long id); void add (užívateľ užívateľa); void update (Užívateľský užívateľ); void remove (užívateľ užívateľa); }
Tu sme pridali niekoľko bežných metód ako dostať, pridať, aktualizovaťa odstrániť pracovať so zbierkou predmetov.
3.2. UserRepositoryImpl
Potom vytvoríme UserRepositoryImpl triedy zabezpečujúcej implementáciu UserRepository rozhranie: Tu sme použili UserDaoImpl na odosielanie / načítanie údajov z databázy. Zatiaľ môžeme povedať, že implementácie DAO a úložiska vyzerajú veľmi podobne, pretože Používateľ trieda je anemická doména. A úložisko je len ďalšou vrstvou nad vrstvou prístupu k dátam (DAO). Zdá sa však, že DAO je dokonalým kandidátom na prístup k údajom a úložisko je ideálnym spôsobom na implementáciu obchodného prípadu použitia.. Aby sme jasne pochopili posledné tvrdenie, vylepšme náš Používateľ doména na vybavenie obchodného prípadu použitia. Predstavte si, že chceme pripraviť profil používateľa na sociálnych sieťach agregáciou jeho tweetov na Twitteri, príspevkov na Facebooku a ďalších. Najskôr vytvoríme Tweet trieda s niekoľkými vlastnosťami, ktoré obsahujú informácie o tweete: Potom, podobne ako UserDao, vytvoríme TweetDao rozhranie, ktoré umožňuje načítanie tweetov: Rovnako vytvoríme TweetDaoImpl triedy, ktorá poskytuje implementáciu fetchTweets metóda: Tu zavoláme Twitter API, aby sme pomocou jeho e-mailu načítali všetky tweety používateľom. V takom prípade teda DAO poskytuje mechanizmus prístupu k údajom pomocou rozhraní API tretích strán. Na záver vytvoríme UserSocialMedia podtrieda naša Používateľ triedy viesť zoznam Tweet objekty: Tu, náš UserSocialMedia trieda je komplexná doména obsahujúca vlastnosti domény Používateľ doména tiež. Teraz inovujeme náš UserRepositoryImpl triedy poskytnúť a Používateľ objekt domény spolu so zoznamom tweetov: Tu je UserRepositoryImpl extrahuje údaje používateľa pomocou UserDaoImpl a tweety používateľov pomocou TweetDaoImpl. Potom agreguje obe sady informácií a poskytuje doménový objekt UserSocialMedia triedy, ktorá sa hodí pre náš prípad použitia na podnikanie. Preto úložisko sa pri prístupe k údajom z rôznych zdrojov spolieha na DAO. Podobne môžeme vylepšiť svoje Používateľ doménu, aby ste si udržali zoznam príspevkov na Facebooku. Teraz, keď sme videli nuansy vzorcov DAO a Repository, zhrňme ich rozdiely: Taktiež, ak máme anemickú doménu, bude úložisko iba DAO. Navyše, vzor úložiska podporuje dizajn riadený doménami a poskytuje ľahké pochopenie dátovej štruktúry aj pre netechnických členov tímu. V tomto článku sme skúmali rozdiely medzi vzorcami DAO a Repository. Najskôr sme preskúmali základnú implementáciu vzoru DAO. Potom sme videli podobnú implementáciu pomocou vzoru Repository. Napokon sme sa pozreli na úložisko využívajúce viac DAO, ktoré vylepšuje možnosti domény pri riešení obchodných prípadov použitia. Preto môžeme dospieť k záveru, že vzor Repository dokazuje lepší prístup, keď sa aplikácia presunie z oblasti zameranej na dáta do obchodnej orientácie. Ako obvykle sú všetky implementácie kódu dostupné na GitHub.verejná trieda UserRepositoryImpl implementuje UserRepository {private UserDaoImpl userDaoImpl; @ Verejné zverejnenie User get (Long id) {User user = userDaoImpl.read (id); návratový užívateľ; } @Override public void add (užívateľský používateľ) {userDaoImpl.create (užívateľ); } // ...}
4. Vzor úložiska s viacerými DAO
4.1. Tweet
verejná trieda Tweet {private String email; private String tweetText; súkromné Dátum dátum Vytvorené; // zakladatelia a zakladatelia}
4.2. TweetDao a TweetDaoImpl
verejné rozhranie TweetDao {List fetchTweets (String email); }
verejná trieda TweetDaoImpl implementuje TweetDao {@Override public List fetchTweets (reťazcový e-mail) {List tweets = new ArrayList (); // volanie rozhrania Twitter API a príprava tweetu objektu na vrátenie tweetov; }}
4.3. Vylepšiť Používateľ Doména
verejná trieda UserSocialMedia rozširuje tweety používateľa {private List; // zakladatelia a zakladatelia}
4.4. UserRepositoryImpl
verejná trieda UserRepositoryImpl implementuje UserRepository {private UserDaoImpl userDaoImpl; súkromný TweetDaoImpl tweetDaoImpl; @ Verejné zverejnenie User get (Long id) {UserSocialMedia user = (UserSocialMedia) userDaoImpl.read (id); Zoznam tweetov = tweetDaoImpl.fetchTweets (user.getEmail ()); user.setTweets (tweety); návratový užívateľ; }}
5. Porovnanie dvoch vzorov
6. Záver