2008-09-09 9 views
11

Kısa bir süre önce yeni bir web formları projesi başlattım ve iş sınıflarını herhangi bir DBML referansından ayırmaya karar verdim. İş katmam sınıflarım, ayrık Veri katmanı yöntemlerine erişir ve DTO'ların koleksiyonlarını döndürür. Yani veri katmanı gibi DTO en proje olabilir aşağıdadır: DTO nesneleri bina iş yükler, ancak bu sıkı bağlama & Business arasındaki veri katmanları için daha iyi bir yaklaşım gibi hissediyor ve ben olmadan İş katmanı test edebilirsiniz anlamına gelir Linq'den SQL ve DTO'ya olan endişeleri ayırma

(from c in dataContext.Customers 
where c.Active == true 
select new DTO.Customer 
{ 
    CustomerID = c.CustomerID, 
    Name = c.CustomerName, 
    ... 
}).ToList() 

bir veritabanı mevcut.

Sorum şu: Bu iyi bir uygulama mı ?, DTO'ları (belki SQLMetal üzerinden) oluşturmanın bir yolu var mı ve proje ilerledikçe başka hangi sorunlara varabilirim?

+0

Burada dış XML eşlemesi hakkında bazı bağlantılar gönderdim: http://stackoverflow.com/questions/988872/linq-to-sql-external-mapping/1136039#1136039 – alexandrul

cevap

5

En iyi uygulama olup olmadığını bilmiyorum ama yakın geçmişte benzer kod yazdım çünkü endişelerimin ayrılmasını LINQ-tasarımcısı tarafından oluşturulan yerine kendi sınıflarım kullanarak geliştirebileceğimi hissettim. benim uygulamamdakiler.

Sadece kendi veri erişimi yöntemi kullanırken bir IList < Müşteri > yerine bir IQueryable < Müşteri > dönen düşünebilirsiniz. IQueryable <T>, IEnumerable <T>'dan miras aldığı için, uygulamanızın geri kalanı, oldukça iyi bir şekilde ilgilenebilmelidir. Gerçekten ihtiyacınız olduğunda bunu bir Listeye dönüştürebilirsiniz.

Bunun avantajı, sorgunuzu dinamik olarak kolayca değiştirebilmeniz ve SQL Server'dan döndürülen veri miktarını minimuma indirebilmenizdir.

E.g. yöntem imzanızın IQueryable < Müşteri > GetCustomers() öğesi, GetCustomers() öğesini arayarak tek bir müşteri kazanabilirse. (c => c.CustomerID == 101) .Single();

Bu örnekte, veritabanından yalnızca bir kayıt döndürülürken, şu anda kodunuzun tüm müşterilere döneceğini veya tüm farklıları karşılamak için ayrı yöntemler (ve dolayısıyla çok tekrarlanan kod) yazmanız gerektiğini tahmin ediyorum. filtrelemek isteyebileceğiniz şeyler.

+4

Tam tersini öneriyorum. DAL dışında bir IList üzerinde bir IQuerable döndüremezdim. Bunu yaparsanız, sunum katmanınız büyük olasılıkla veritabanı sorgularını yanlışlıkla çalıştırmayı sonlandırabilir veya Linq'den nesneye çağrıları karıştırarak Linq'den sql'e kadar bir hata alabilirsiniz. IQuerable'un Linq-to-sql'den döndürülmesi gerçekten zayıf ve sızıntılı bir mimari oluşturuyor ve her şeyden önce en iyi oyuncak uygulamaları için kaçınılmalıdır. – mattmc3

2

Bence, çoğu durumda LINQ ile çalışırken DTO nesneleri gerekli değildir. Oluşturulan LINQ sınıfları kolayca test edilebilir. LINQ, verilerinizi aynı sorguları kullanarak farklı kaynaklardan sorgulamanızı sağlar. Sorgularınızı gerçek db yerine cisimlerin listelerine karşı test etme imkanı verir.

+0

Anlaştık. Özünde, Linq-to-sql nesneleriniz DTO'lar olarak ele alınabilir ve seri hale getirilebilir olarak L2S nesnelerini oluşturmak için bir T4 şablonu bile vardır. – mattmc3