Kerangka Entitas dan pemisahan lapisan

12

Saya mencoba untuk bekerja sedikit dengan Kerangka Entity dan saya mendapat pertanyaan tentang pemisahan lapisan.

Saya biasanya menggunakan UI -> BLL -> DAL dan saya ingin tahu bagaimana cara menggunakan EF di sini.

DAL saya biasanya berupa sesuatu

GetPerson(id)
{
    // some sql
    return new Person(...)
}

BLL:

GetPerson(id)
{
    Return personDL.GetPerson(id)
}

UI:

Person p = personBL.GetPerson(id)

Pertanyaan saya sekarang adalah: karena EF membuat model dan DAL saya, apakah ide yang baik untuk memasukkan EF ke dalam DAL saya sendiri atau hanya membuang-buang waktu?

Jika saya tidak perlu membungkus EF apakah saya akan tetap menempatkan Model.esmx saya di perpustakaan kelasnya sendiri atau akan lebih baik untuk menempatkannya di dalam BLL saya dan mengerjakannya di sana?

Saya tidak bisa melihat alasan untuk memasukkan EF ke dalam DAL saya sendiri tetapi saya ingin tahu apa yang dilakukan orang lain.

Jadi alih-alih memiliki yang di atas, saya akan meninggalkan DAL dan hanya melakukan:

BLL:

GetPerson(id)
{
    using (TestEntities context = new TestEntities())
    {
            var result = from p in context.Persons.Where(p => p.Id = id)            
                    select p;
    }
}

Apa yang harus dilakukan?

Thomas
sumber

Jawaban:

13

Contoh yang Anda berikan adalah arsitektur yang hampir tidak berlapis. Saya tahu ini disederhanakan, tetapi:

Lapisan presentasi Anda secara langsung terkait dengan entitas Orang. Ini OK hanya dalam kasus yang paling sederhana, dan jelas tidak ketika Anda mencoba mendefinisikan layer Anda.

Metode GetPerson juga menggunakan praktik yang agak buruk dalam menciptakan konteks baru untuk setiap panggilan. Anda harus mendapatkan konteks di konstruktor, dan itu akan disediakan oleh wadah IOC Anda.

Struktur sederhana, namun efektif yang saya gunakan adalah:

  • Project.Core - berisi model tampilan dan antarmuka.
  • Project.DAL - dengan EDMX saya dan kode yang dihasilkan.
  • Project.BLL - logika bisnis.
  • Project.Web - aplikasi web itu sendiri.

Penting untuk dicatat bahwa:

  • Core tidak bergantung pada solusi lain.
  • DAL tidak tergantung pada solusi lain.
  • Project.Web tergantung pada Core, tetapi tidak pada DAL atau BLL.
  • BLL tergantung pada Core dan DAL.
Boris Yankov
sumber
1
Core akan muncul menjadi lapisan objek bisnis.
sq33G
Ini cukup banyak apa yang saya gunakan juga, namun, saya akan menambahkan DLL tambahan untuk memenuhi deklarasi antarmuka. Dengan cara ini Anda hanya mereferensikan antarmuka (dan menggunakan sesuatu seperti [url = unity.codeplex.com/[Unity[/url] untuk DI) dan Anda dapat yakin bahwa tidak ada dependensi aneh yang secara tidak sengaja Anda hasilkan.
Ed James
Biasanya, tanpa EF saya membuat kelas Person saya sendiri di lapisan "Model", jadi saya punya UI, BLL, DAL dan Model di mana: UI tahu BLL dan Model. BLL tahu DAL dan Model. DLL tahu Model. Apakah Anda juga membuat "model tampilan" dan mengapa Anda tidak hanya menggunakan yang dihasilkan EF? (saya tahu ini bertentangan dengan arsitektur berlapis, tetapi berapa kali Anda benar-benar mengubah cara Anda mendapatkan data?)
Thomas
@ Thomas membungkus model tampilan dalam sesuatu yang abstrak akan membuat pengujian unit jauh lebih mudah.
sq33G
3
model! = lihat model
Boris Yankov
2

Anda tidak perlu membungkus EDMX Anda dengan apa pun.

Jika Anda dapat melihat kemungkinan perlu mengubah dari EF ke beberapa pendekatan lain, Anda mungkin ingin memperluas objek bisnis Anda (mengambil keuntungan dari kelas parsial) untuk mengimplementasikan antarmuka yang didefinisikan dalam lapisan Objek Bisnis yang terpisah.

Kemudian dari kode Anda, Anda hanya akan berurusan dengan antarmuka tersebut dan bukan dengan kelas yang dihasilkan secara konkret. Mungkin diperlukan sedikit kode lem untuk menahannya; bahwa dengan EDMX dapat menjadi DAL Anda.

sq33G
sumber
Jadi jika saya tidak memaksakan perubahan dari EF ke pendekatan lain, kode saya di atas akan baik-baik saja? Saya hanya akan memiliki UI dan BLL (di mana EDMX berada di BLL)?
Thomas
Jawaban pragmatis saya adalah ya. Dengan peringatan bahwa Anda mungkin benar-benar ingin meletakkan EDMX di majelis kecilnya sendiri jika itu akan besar dan sebagian besar statis, sehingga Anda tidak perlu mengkompilasi ulang / mendistribusikannya kembali sesering mungkin.
sq33G
Ah, poin bagus tentang kompilasi / redistribusi :)
Thomas
2

Ada dua pendekatan umum untuk layering: layering ketat dan layering santai.

Sebuah pendekatan berlapis ketat membatasi komponen dalam satu lapisan untuk berinteraksi hanya dengan rekan-rekan dan dengan lapisan tepat di bawah.

Aplikasi berlapis yang santai mengendurkan kendala sehingga komponen dapat berinteraksi dengan komponen dari lapisan bawah mana pun.

Menggunakan layering yang santai dapat meningkatkan efisiensi karena sistem tidak harus meneruskan panggilan sederhana dari satu layer ke yang berikutnya. Di sisi lain, menggunakan pelapisan yang santai tidak memberikan tingkat isolasi yang sama antara lapisan dan membuatnya lebih sulit untuk menukar lapisan yang lebih rendah tanpa mempengaruhi lapisan yang lebih tinggi.

Untuk solusi besar yang melibatkan banyak komponen perangkat lunak, adalah umum untuk memiliki sejumlah besar komponen pada tingkat abstraksi yang sama yang tidak kohesif. Dalam hal ini, setiap lapisan dapat diuraikan lebih lanjut menjadi satu atau lebih subsistem yang kohesif. Gambar 2 mengilustrasikan notasi Unified Modelling Language (UML) untuk mewakili lapisan yang terdiri dari beberapa subsistem.

kesimpulan: jika Anda tidak perlu lapisan tengah kehilangan itu; tidak semua aplikasi memerlukan pendekatan yang sama dan entah bagaimana menambahkan layer hanya untuk tujuan layering akan dikenakan penalti pada biaya dan perawatan yang rumit.

omarqa
sumber