Hubungan antara Repositori dan Unit Kerja


17

Saya akan mengimplementasikan repositori, dan saya ingin menggunakan pola UOW karena konsumen repositori dapat melakukan beberapa operasi, dan saya ingin mengkomitnya sekaligus.

Setelah membaca beberapa artikel tentang masalah ini, saya masih belum mengerti bagaimana menghubungkan kedua elemen ini, tergantung pada artikel yang sedang dikerjakan dengan cara yang lain.

Kadang-kadang UOW adalah sesuatu yang internal ke repositori:

public class Repository
{
    UnitOfWork _uow;

    public Repository()
    {
       _uow = IoC.Get<UnitOfWork>();
    }

    public void Save(Entity e)
    {
        _uow.Track(e);
    }

    public void SubmittChanges()
    {
        SaveInStorage(_uow.GetChanges());
    }
}

Dan terkadang itu eksternal:

public class Repository
{
    public void Save(Entity e, UnitOfWork uow)
    {
        uow.Track(e);
    }

    public void SubmittChanges(UnitOfWork uow)
    {
        SaveInStorage(uow.GetChanges());
    }
}

Di waktu lain, adalah UOW yang mereferensikan Repositori

public class UnitOfWork
{
    Repository _repository;

    public UnitOfWork(Repository repository)
    {
       _repository = repository;
    }

    public void Save(Entity e)
    {
        this.Track(e);
    }

    public void SubmittChanges()
    {
       _repository.Save(this.GetChanges());
    }
}

Bagaimana kedua elemen ini terkait? UOW melacak elemen yang perlu diubah, dan repositori berisi logika untuk mempertahankan perubahan itu, tapi ... siapa yang memanggil siapa? Apakah yang terakhir lebih masuk akal?

Juga, siapa yang mengelola koneksi? Jika beberapa operasi harus dilakukan dalam repositori, saya pikir menggunakan koneksi yang sama dan bahkan transaksi lebih banyak suara, jadi mungkin menempatkan objek koneksi di dalam UOW dan yang ini di dalam repositori juga masuk akal.

Bersulang


Jawaban:


7

Re: "UOW melacak elemen-elemen yang perlu diubah, dan repositori berisi logika untuk mempertahankan perubahan itu, tetapi ... siapa yang memanggil siapa?"

Anda memahami tanggung jawab dasar kelas-kelas ini. Anda mengatakan bahwa setiap artikel, yang telah Anda baca, menghubungkannya bersama-sama dengan cara yang berbeda. Ini menyiratkan bahwa keputusan tentang "siapa yang memanggil siapa" terserah Anda.

Saya akan mencoba untuk membuat sketsa masalah dalam hal 'lapisan' sementara dipandu oleh prinsip-prinsip dasar desain perangkat lunak yang baik seperti Kohesi , Decoupling , Reusability , Unit-Testability dll.

Mengutip Eric Evans Domain Driven Design, (2004) Addison Wesley, hal 69 :

Prinsip utama [dari Layered Archituctures] adalah bahwa setiap elemen dari layer hanya bergantung pada elemen lain di layer yang sama atau pada elemen dari layer "di bawah" itu.

Menurut pendapat saya, baik UOW dan Repo adalah dua kelas yang sangat berbeda yang memiliki tanggung jawab yang jelas, independen,. Untuk memulainya, saya tidak akan meminta yang lain.

Saya pikir Anda memerlukan beberapa kelas klien ketiga (yaitu a controlleratau service class) yang benar - benar tahu 'kapan dan apa yang akan didapat' dari repo dan 'kapan' untuk menyimpan transaksi. Klien ini duduk relatif tinggi dalam arsitektur (sehingga dapat mengetahui lebih banyak kelas) dan dapat melakukan orkestrasi di antara keduanya.

--------------------------------

         [Client]
           /   \
----------/---- \---------------
         /       \
        V         V
[Unit Of Work]  [Repo]


--------------------------------

2

Metode yang paling umum diberikan ke antarmuka UOW (yang biasanya dibangun melalui pabrik).

Anda biasanya memanggil metode pada antarmuka UOW dari kelas pola perintah / fasad. Karena UOW hanya menolak IO basis data hingga nanti (untuk mencegah Anda melakukan transaksi yang sudah berjalan lama atau beberapa panggilan ke basis data yang mungkin tidak perlu), bekerja dengan UOW harus berada pada tingkat yang sama seperti yang biasanya Anda lakukan dengan basis data Anda.

Microsoft memiliki posting yang sangat teliti tentang pola UOW:

http://msdn.microsoft.com/en-us/magazine/dd882510.aspx

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.