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.
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 –