ASP.net 5 ve EF7'de depolara artık ihtiyaç var mı?


9

EF Team'e github ile ilgili bir soru gönderdim. Bu soruyu burada sormanın daha iyi olacağını söyleyen bir yanıt aldım, bu yüzden kopyalayıp buraya bağlantı olarak yapıştıracağım, böylece diğerleri GitHub'daki birkaç cevabı görebilir.

Soru: Biraz araştırma yapıyordum ve birisi DBContext Class'ın 24. Hattının belirttiğine dikkat çekti

DbContext Çalışma Birimi ve Veri Havuzu kalıplarının bir kombinasyonudur.

Bu, artık EF'i bir Depoya soyutlamamıza ve ardından Denetleyicilere enjekte etmek için ve Arayüz kullanmamıza gerek olmadığı anlamına mı geliyor?

Github'daki orijinal yayın: https://github.com/aspnet/EntityFramework/issues/4899

Bunu sormamın nedeni, GetById, GetByName, GetWithIncludesABC, GetWithIncludes123, vb.Gibi depoya birçok yöntem eklediğim bir noktaya girmem gibi görünüyor ve aklımdaki repoyu kirletiyor gibi görünüyor


1
Rowanmiller'ın verdiği cevap hakkında ne düşünüyorsun ? Bana çok mantıklı geliyor.
Robert Harvey

@RobertHarvey Evet iyi bir cevaptı ama ben depoya ya da değil bir karar vermeden önce başkalarının konu hakkında nasıl hissediyorum görmek istiyorum
Loren.Dorez

Bogard'un benzer şekilde tartıştığı lostechies.com/jimmybogard/2009/09/11/wither-the-repository bölümüne de bakınız .
mcknz

EF'nin (ve diğer ORM'lerin) neden depo olmadığı konusundaki düşüncelerim .
Eric King

Bir havuzun GetWithIncludesABC gibi bir yöntemi olmazdı. Havuz örüntüsü, temel olarak bir koleksiyon olarak bir veritabanı tablosunun bir soyutlamasıdır. Genellikle, koleksiyonu sorgulamak (örneğin, LINQ ile) mümkündür ve depo daha sonra sorguyu SQL'e dönüştürür. Bahsettikleriniz daha çok Veri Ağ Geçidi gibi geliyor.
Bay Cochese

Yanıtlar:


12

Aşağıdaki gibi bir depoya yöntem ekliyorsanız

GetById 
GetByName 
GetWithIncludesABC
GetWithIncludes123

Ardından , bir Hizmet Katmanına geçmek ve Hizmet Katmanının doğrudan EF kullanmasına izin vermek daha iyidir . EF zaten sonsuz bir şekilde kopyaladığınız yukarıdaki yöntemlere benzer bir işleve sahiptir.

Hizmet Katmanı Ticari Etki Alanı yöntemlerini ortaya koyar ve bunları uygulamak için CRUD kullanır . Örneğin, TransferMoney(A, B)A ve B'nin hesapları kontrol ettiği bir yöntem olabilir . Bu, Hizmet Katmanı CRUD'yi sizin için yönetirken iş alanınızın dilini konuşmanıza olanak tanır.

Ayrı bir Depo Katmanına sahip olabileceğiniz yeri düşünebileceğim tek zorlayıcı sebep, bu depo katmanıyla alay edebilmeniz veya test amacıyla farklı bir veri kaynağının yerini alabilmenizdir.



4

Robert Harvey cevabında şunları söyledi:

Ayrı bir Depo Katmanına sahip olabileceğiniz yeri düşünebileceğim tek zorlayıcı sebep, bu depo katmanıyla alay edebilmeniz veya test amacıyla farklı bir veri kaynağının yerini alabilmenizdir.

Bu nedenle Havuz Kalıbı hala önemlidir. Ayrıca, Varlık Çerçevesi ekiplerinin Depo Modelini uyguladıkları iddiasına katılmıyorum. Entity Framework hala bir veritabanına bağlı. Havuz Modelinin tüm amacı, uygulamanızda kullanılan kesin kalıcılık mekanizmasını ayırmak ve soyutlamaktır, böylece veri erişiminin uygulanmasından hiçbir şey depo katmanının dışına sızmaz.

EF sorgu API'sini bir tür hizmet nesnesinde olduğu gibi "depo" dışında kullanıyorsanız, kalıbı bozduğunuzu söyleyebilirim.

Şimdi, işlevsellik gibi veritabanının diğer kodunuza sızması gibi yıkıcı bir sorun değilse ve CRUD işlemlerinizin bir kısmını gelecekte bir web hizmetine taşımanız gerekmeyeceğini garanti ederseniz, doğrudan EF kullanmak, TAMAM.

Temel olarak, Entity Framework , Havuz Modelinde Gateway nesnesinin yerini alır . Bunu bir depo olarak görmüyorum.


Havuzun Hizmet Katmanı yönünden farkı nedir? im IQueryable dönen sonra ne bulabilirim ben im IEnumerable sonra im bir servis katmanı kullanarak dönen eğer im esas olarak bir Depo. Bu doğru mu? Hizmet Katmanı ve Havuz Kalıpları Benzer mi?
Loren.Dorez

@ Loren.Dorez: Hizmet Katmanı ve gibi İş Etki Alanına Özel yöntemlere sahiptir . Bir Havuz sadece CRUD yöntemleri içerir. TransferFunds()BuildWidget()
Robert Harvey

O halde hem Servis Katmanı hem de Depo doğrudan DBContext'e erişir mi? Yani CRUD Repo ve Get Yöntemleri ve diğer yöntemler Hizmet Katmanı koymak istiyorsunuz? Bunu doğru anladım mı?
Loren.Dorez

Hizmet Katmanı, doğrudan EF yerine, Depoya erişebilir.
Robert Harvey

@RobertHarvey Yukarıdaki Get Methds'ı kullanarak bana bir örnek gösterebilir misiniz? Şimdilik biraz üzgünüm üzgünüm.
Loren.Dorez

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.