SORU
20 Ocak 2009, Salı


SQL bu SERİ ve depo desen

Daireler etrafında dönüyorum gibi hissediyorum. Sağ depo desen LINQ to SQL kullanarak ne gibi karar veremiyorum. Eğer haberiniz Rob Conery's MVC Storefront göreceksiniz bu onun uygulama sarar kontrol ETMENİZ oluşturulan modeller ile başka bir sınıf ve ikramlar kontrol ETMENİZ tarafından oluşturulan bir basit bir data transfer object (DTO). Şöyle bir şey:

//Custom wrapper class.
namespace Data
{
    public class Customer
    {
         public int Id {get;set;}
         public string Name {get;set;}
         public IList<Address> Addresses {get;set;}
    }
}

//Linq-Generated Class - severly abbreviated
namespace SqlRepository
{
    public class Customer
    {
         public int Id {get;set;}
         public string Name {get;set;}
         public EntitySet<Address> {get;set;}
    }
}

//Customer Repository
namespace SqlRepository
{
    public class UserRepository : IUserRepository
    {
        private _db = new DB(); //This is the Linq-To-Sql datacontext

        public IQueryable GetCusomters()
        {
            return
                from c in _db.Customers
                select new Customer // This is the wrapper class not the gen'd one
                {
                   Id = c.Id,
                   Name = c.Name,
                   Addresses = new LazyList(c.Addresses)
                };
        }

Mike Hadlow in önerdiği şekilde karşı bu şekilde yapmanın avantajı (kapsayıcı bir sınıf kullanarak)Using the IRepository pattern with LINQ to SQLİRepository< onun versiyonu;T>o sadece deposundan DTO nesneleri döndürür nerede?

İş mantığı tarafından kontrol edilmelidir? Bu ayrı bir katman olarak hep birlikte veya dahili sarıcı sınıfı için kaydetme/güncelleme depoyu tarafından denir?

CEVAP
20 Ocak 2009, Salı


Durum şu ki, SQL bu SERİ Object Relation Mapper Bir doğru değildir (ORM), veri Erişim Katmanı jeneratör. Derin el, XML dosyalarını düzenlemek ve SqlMetal ile oynayarak giderek bir ORM olmak falan yapabilirsiniz, ama parladığı DAL olarak.

Bir ORM arkasındaki fikir bu. SQL veritabanı var, ve etki alanı nesneleri. Düzgün bir veritabanı tasarımı, mantıksal olarak doğru tasarlanmış nesne modeli çevirmek yok, ya da tam tersi şeyler yapacaksın (normalleştirme gibi). Bu "Empedans Uyumsuzluğu", bir ORM rolünü temiz olan uyumsuzluğu ile başa çıkmak için, etkili ve verimli bir şekilde denir. Daha az acı veritabanı etkileşimi ikincil bir şey neredeyse.

Bir depo arkasındaki fikir her sebat mantık Kapsüller ve uygulama geri kalanı altyapı bağımlılıkları. Uygulamanız Müşteri bir nesneye ihtiyaç duyduğunda, SQL Server, MySQL, XML dosyası veya ASP.NET Üyelik gelen olup olmadığını bilmesi gerekirdi. De-kaplin bundan sonra herhangi bir değişiklik kalıcılık hikayeni yaptığınız başvurunuzu geri kalanı üzerinde hiçbir etkisi yoktur.

Bunu unutmayın, ne yaptığını neden yaptığını daha net alır. SQL ETMENİZ DAL oluşturmak için kullanılır, ama bu DAL hakkında bilinmesi gereken tek şey deposudur, bir çeviri onun etki nesneler için yapılır. Bu şekilde kalıcılık hikayesini endişesi olmadan etki alanı modeli yeniden Düzenle ve onun uygulama boyunca dalgalanma etkileri endişesi olmadan onun veritabanı yeniden yapabilir. Ayrıca iş mantığı kodlama kullanmak ORM, hatta kendi veri deposu gibi sorular üzerinde karar vermeden önce başlatabilirdi.

Eğer gerçek bir ORM kullanmak (NHibernate) olsaydı, bu eşleştirme kodu başka bir yerde (ya da XML veya önyükleme sınıflar) ele alır. ETMENİZ için SQL (kaynak DAL, SubSonic Çalmaktadır açık) büyük projeler olduğunu düşünüyorum, ama daha küçük, iki katmanlı depo desen gibi bir şey overkill olduğu uygulamalar için tasarlanmıştır. Mağazası da Arabiriminin ek karmaşıklığı önemli olabilir neden iyi bir örnek. Kendisi bir senaryo bu tür, bunu elle yapmak yerine kendi işlemek için inşa ile giderek bir sürü kod kurtarabilirdi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 99being99

    99being99

    2 EYLÜL 2008
  • Kingsimba357

    Kingsimba357

    7 NİSAN 2008
  • WoodysGamertag

    WoodysGamert

    17 Aralık 2009