Bu kötü tasarım mı? nasıl geliştirilebilir?


9

Bir süre önce aşağıdakileri yazdım, ama son zamanlarda gözden geçirmeye geldim ve şimdi bunun iyi bir tasarım olduğunu düşünmüyorum.

Tasarım, Entity Framework 4 kullanan bir tür modüler veritabanı katmanı içindir. Belirli bir konumdaki harici kitaplıklardan varlık çerçevesi bağlamlarını yükleyen (tembel olarak) tek bir veritabanı nesnesi vardır ve yüklenen bağlamların örnekleri bir hash tablosunda isimleri (EG "ContentMgmtContext").

Bu sistemdeki veritabanı ile tüm temas saklı yordamlar yoluyla yapılır. Veritabanına çağrı yapmak için sorgu yöntemi imzası şöyle görünür:

List<TReturn> Query<TReturn>(string Context, 
                             string Procedure, 
                             TransactionScope Scope, 
                             List<ObjectParameter> QueryParameters)

Bu modülerlik sevdiğim bir şey. Ancak, bu yaklaşımın önemli bir dezavantajı vardır: when using the database layer, the code using it has to have a reference to the library in which the context is stored, in order to access the types returned by the stored procedures through Entity Framework.Modelde, veritabanı katmanındaki nesneler, görünüm ve denetleyicinin kullandığı yeni nesnelere çevrilir.

Bunun kötü bir tasarım olduğunu düşünüyorum, ancak nasıl geliştirebilirim? IStoredProecedureObjectSaklı bir yordam tarafından döndürülen her veri türü ortak bir temel türü vermek gibi boş bir arabirim eklemeyi düşündüm , ancak bu Entity Framework tarafından başarısız gibi görünüyor. Her zaman .edmxdosya derlenmiş çekirdekler, kod yeniden oluşturulur ve herhangi bir ekleme kaldırıldı. Bunun olmasını engellemenin bir yolu var mı?

Bu tasarımı nasıl geliştirebilirim? Ne (başka) ile ilgili yanlış? Yoksa doğru yolda mıyım?

Yanıtlar:


6

Feragatname: Varlık çerçevesini kullanmıyorum ve hemen hemen herhangi bir veritabanı yardımcı çerçevesine karşı önyargılıyım.

Görünüşe göre bir sarıcı yapmışsın.

"Sarıcı" ve "katman" arasında bir ayrım yapıyorum. Katman kendi DLL / proje / Jar / ne olursa olsun derlemek bir şey olmak. Veri erişim katmanı. Wrapper, bu DLL içinde kullandığınız bir "yardımcı" sınıftır. Arayüzü basitleştirmek veya çoğaltmayı ortadan kaldırmak amacıyla.

Veritabanı erişimi arayüzünü basitleştirmeyle ilgili sorun, genellikle basit olmamasıdır. Sonunda ADO / JDBC / etc'nin arayüzünü çoğaltırsınız. Ya da insanları onu atlamaya zorlarsınız. Sarmalayıcılar her türlü istenmeyen şeyi yapma eğilimindedir. Bir işlemi desteklemek için açık olması gerektiğinde bağlantıyı otomatik olarak kapatabilirler. Verileri akışa almak zorundaysanız ve çöp toplanan dillerden birini kullanıyorsanız, bağlantıları yanlışlıkla açık bırakırlar. Kitaplığınızın tam gücünü sarıcısının arkasına vermek için kopyalamak zorundasınız.

ADO / JDBC gibi kütüphaneler zaten BÜYÜK bir arayüz. Bunlar doğru yapılan en iyi OOP örneklerinden bazıları. Bazı wizbang şapkasını çıkardı bir sarıcı üzerinde kullanmayı tercih ederdim.

Klasik JDBC / ADO tarzı arayüz iyi bilinir ve anlaşılır. Şapkandan çıkardığın sarıcı değil.

Gereksiz "parametreleri" azaltmak mı istiyorsunuz? Jeneriklere bakın. Ya da sadece "paramter.Add" değerini azaltmaya çalışarak ".add" kodunu başka bir kod katmanına itmeyi kabul edersiniz.

BTW bu harika bir soru. Mümkünse 10 kez vesile olurdum.

Düzenleme: Tabii ki JDBC kodu veri erişim katmanında gizli olacaktı.


Geriye dönüp baktığımda, bunun EF 4'ün kendisinden daha fazla bir sarıcı olduğunu kabul ediyorum. Bunun arkasındaki fikir, her biri yeniden kullanılabilirlik özelliğine sahip birden çok veritabanı için tek bir giriş noktasına sahip olurken, farklı veritabanı bağlantı parçalarının (standart veri modeli gibi) yeniden kullanılmasına izin vermekti. Bu veritabanı sarmalayıcı ayrı bir kütüphanede derlenir (diğer iş mantığı ile birlikte). Tasarımımı geliştirmek için değiştirmemi nasıl önerirsiniz?
Andy Hunt

EF Önyargılarınıza rağmen harika içerik için +1 ... ancak EF bir DB yardımcı çerçevesinden daha fazlasıdır. Bunun için bir ambalaj yapmaya çalıştığı konusunda haklısınız.
SoylentGray
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.