2009-09-19 22 views
5

Birkaç farklı veri kaynağına endeksli bir arama uygulaması yapıyorum. Arama motoru dizinine karşı bir sorgu yapıldığında, her arama sonucu hangi veri kaynağının geldiğini belirtir. Her bir arama sonucu türü için farklı bir şablon görüntülediğim bir fabrika kalıbı oluşturdum. Ancak, arama motoru tarafından daha fazla veri kaynağının endekslendiğinden bu modelin yönetilmesi daha zor hale geleceğini fark ettim. Her yeni veri kaynağı için kod şablonu oluşturulmalıdır). C# Fabrika Modeli

Ben korumak için bu arama uygulaması daha kolay hale getirmek için üzerinde DotNetSlackers.com

factory pattern http://img11.imageshack.us/img11/8382/factoryi.jpg

biz Granville Barnett bir makalesinden dışına göre benim fabrikası için aşağıdaki yapı oluşturmuş, benim düşünce kümesi yaratmaktı hangi şablonun oluşturulacağını belirlemek için fabrika modelimin referans gösterebileceği ayrı şablon türlerini tanımlamak için kullanılabilecek veritabanı tabloları. Arama sonucu veri kaynağına dayalı olarak oluşturulacak şablon türünü belirtmek için kullanılacak bir tabloya sahip olmam gerektiğini düşündüm. O zaman bu şablon türü için görüntülenecek alanları belirtmek için bir tablo (lar) olması gerekir. Ayrıca, bu alanın nasıl oluşturulacağını tanımlamak için kullanılacak bir tabloya (veya şablon tablosunda ek sütunlara) da ihtiyacım var (örn., Köprü, Etiket, CssClass, vb.).

Böyle bir desen örneği olan var mı? Lütfen bana haber ver. Teşekkür, -Robert

cevap

4

Bu önerilen çözümün, şu anda sahip olduğunuz gibi bir veri kaynağını yalnızca kod şablonuna ilişkilendirmekten daha az sürdürülemez olduğunu öneririm. Aslında, şablon şemasını iterek veriyi veri tabanına aktararak esnekliğinizi kaybedeceğinizi söyleyecek kadar ileri gideceğim, ki bu da uygulamanızı zorlaştırıyor.

Örneğin, (bunu doğru anlamak ediyorsam) Diyelim ki özelliklere sahip bu veriler kaynaklarına sahip varsayalım: Daha sonra arama sonuçlarında bu veri kaynaklarının her biri olabilir

Document { Author, DateModified } 
Picture { Size, Caption, Image } 
Song { Artist, Length, AlbumCover } 

. Her öğe farklı bir şekilde işlenir (Resim, sol tarafa sabitlenmiş bir önizleme görüntüsü ile oluşturulabilir veya Şarkı albüm kapağını gösterebilir, vb.)

Sadece tasarladığınız tasarımın altındaki işleme bakalım. Oluşturma için veri tabanını sorgulayacak ve daha sonra yayınladığınız HTML'yi ayarlayacaksınız, çünkü Belgeler için yeşil bir arka plan ve Resimler için mavi bir arka plan istediğinizi söylüyorsunuz. Tartışma uğruna, Şarkılar için iki, Resim için iki ve Dokümanlar için üç arkaplan rengine ihtiyacınız olduğunun farkındasınız. Şimdi, render değerlerini uyguladığınız parametrelenmiş şablonu değiştirmenin yanı sıra, tanıtılan ve dışa aktarılan bir veritabanı şeması değişikliğine bakıyorsunuz.

Ayrıca, Belge sonucunun bir düşürme kontrolü gerektirdiğine, Resmin birkaç düğmeye ihtiyacı olduğuna ve Şarkılar'ın bir ses kontrolüne ihtiyacı olduğuna karar verdiğinizi varsayalım. Şimdi, veri kaynağı başına her şablon büyük ölçüde değişiyor, bu yüzden başladığınız yere geri döndüğünüzde, şu an içinde bir veritabanı katmanı var.

Bu, tasarımın nasıl kırıldığını gösteriyor, çünkü artık esnekliği kaybettiniz. Veri kaynağı başına farklı şablonlar tanımlar. Kaybettiğin diğer şey, kaynak kontrolünde bulunan şablonlarınızı oluşturuyor.

Yayılan görünümlerinizde ortak öğeleri/denetimleri nasıl yeniden kullanabileceğinizi ele alacağım, ancak şablon ile veri kaynağı arasındaki eşlemeyi fabrikada saklayın ve şablonları veri kaynağı başına ayrı dosyalar olarak saklayın.Oluşturmanın CSS veya benzer yapılandırma ayarları ile sürdürülmesine bakın. Eşlemeleri basit bir XML dosyası olarak dışa aktarmayı düşünerek, bakımı daha kolay hale getirmek için. Yeni bir veri kaynağı dağıtmak için, bir eşleme eklemeniz, uygun şablonu ve CSS dosyasını oluşturup bunları beklenen konumlara bırakmanız yeterlidir. Aşağıdaki yorum

Yanıt:

ben basit switch deyimi yeterli olacaktır geliyordu:

çıktısını mantığı, belirli bir şablon var
switch (resultType) 
{ 
    case (ResultType.Song): 
     factory = new SongResultFactory(); 
     template = factory.BuildResult(); 
     break; 
    // ... 

. Uzun bir switch ifadesi daha kompakt bir şey istiyorsanız, bu gibi bir sözlükte eşleştirmeleri oluşturabilirsiniz:

IDictionary<ResultType, ResultFactory> TemplateMap; 
mapping = new Dictionary<ResultType, ResultFactory>(); 
mapping.Add(ResultType.Song, new SongResultFactory()); 
// ... for all mappings. 

Sonra yerine switch ifadesinden, bu tek astar yapabilirsiniz:

template = TemplateMap[resultType].CreateTemplate(); 

Ana argümanım, bir noktada, veritabanında, ya veritabanında, büyük bir anahtar deyiminde ya da başlatılması gereken bu IDictionary örneğinde yer alan haritaların hala devam etmesi gerektiğiydi.

Sen daha ileri götürün ve okumuş basit bir XML dosyasında eşleştirmeleri saklayabilirsiniz:

<TemplateMap> 
    <Mapping ResultType="Song" ResultFactoryType="SongResultFactory" /> 
    <!-- ... --> 
</TemplateMap> 

Ve kullanım yansıma et. ark. IDictionary'ı doldurmak için. Artık eşlemeleri sürdürüyorsunuz, ancak şimdi bir XML dosyasında dağıtımı daha kolay olabilir.

+0

Açıklama için tekrar teşekkür ederiz. Başka bir göz ve fikir seti almak her zaman iyidir! Düşünceleriniz bana düşünmek için birkaç fikir verdi. Tekrar teşekkürler. - Robert –