Vzory DAO vs Repository

1. Prehľad

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:

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ľ); } // ...}

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..

4. Vzor úložiska s viacerými DAO

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.

4.1. Tweet

Najskôr vytvoríme Tweet trieda s niekoľkými vlastnosťami, ktoré obsahujú informácie o tweete:

verejná trieda Tweet {private String email; private String tweetText; súkromné ​​Dátum dátum Vytvorené; // zakladatelia a zakladatelia}

4.2. TweetDao a TweetDaoImpl

Potom, podobne ako UserDao, vytvoríme TweetDao rozhranie, ktoré umožňuje načítanie tweetov:

verejné rozhranie TweetDao {List fetchTweets (String email); }

Rovnako vytvoríme TweetDaoImpl triedy, ktorá poskytuje implementáciu fetchTweets metóda:

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; }}

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.

4.3. Vylepšiť Používateľ Doména

Na záver vytvoríme UserSocialMedia podtrieda naša Používateľ triedy viesť zoznam Tweet objekty:

verejná trieda UserSocialMedia rozširuje tweety používateľa {private List; // zakladatelia a zakladatelia}

Tu, náš UserSocialMedia trieda je komplexná doména obsahujúca vlastnosti domény Používateľ doména tiež.

4.4. UserRepositoryImpl

Teraz inovujeme náš UserRepositoryImpl triedy poskytnúť a Používateľ objekt domény spolu so zoznamom tweetov:

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ľ; }}

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.

5. Porovnanie dvoch vzorov

Teraz, keď sme videli nuansy vzorcov DAO a Repository, zhrňme ich rozdiely:

  • DAO je abstrakcia vytrvalosti údajov. Repozitár je však abstrakciou zbierky objektov
  • DAO je koncept na nižšej úrovni, bližšie k úložným systémom. Repository je však koncept na vyššej úrovni, bližšie k objektom Domain
  • DAO funguje ako vrstva na mapovanie / prístup k údajom a skrýva škaredé dotazy. Repozitár je však vrstva medzi doménami a vrstvami prístupu k údajom, ktorá zakrýva zložitosť zhromažďovania údajov a prípravy doménového objektu
  • DAO nie je možné implementovať pomocou úložiska. Repozitár však môže používať DAO na prístup k podkladovému úložisku

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.

6. Záver

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.


$config[zx-auto] not found$config[zx-overlay] not found