by Suat TUNCER
8. Temmuz 2010 11:37
Merhabalar,
Geliştirdiği projelerinin ölçeği büyüyen ve yönetilebilmesi daha kolay uygulamalar geliştirmek isteyen arkadaşlara yardımcı olacağını düşündüğüm ve geliştirdiğim projelerde uyguladığım genel yaklaşımları vakit buldukça paylaşmayı düşünüyorum. Bunun için ilk “Best Practice”imi aşağıda bulabilirsiniz :)
Web uygulamaları ile çalışırken, çoğunlukta web mimarisinden kaynaklı bazı sıkıntılar yaşarız. Özellikle nesnelerin durum bilgilerini saklamak, içerikler arasında veri paylaşmak ciddi bir problemdir. Bu gibi işler için session state, query string, application state gibi key-value yapısıyla çalışan nesneleri kullanırız. Bu nesneler aslında web uygulamalarında yönetilmesi en sıkıntılı kısımlardan biridir. Uygulamadaki tüm içeriklerin application state içerisinde bir nesneye, kullanıcı oturumundaki tüm içeriklerden aynı session statede bulunan nesneye erişmek isteriz. Hele ki birden fazla developer ile uygulama geliştirdiğimizde kullanacağımız keyler çok daha dikkatli seçilmelidir. Bir içerikte oluşturulan "liste" adında genel bir ismin başka bir içerikte yine tanımlanma ihtimali yüksektir.
Geliştiriciye düşen en büyük sorumluluk ise uygulamanın tamamında kullanılan session nesnelerinin nerede oluşturulduğunu ve isimlerinin neler olduğunu takip etmesi. Bu yüzde işi şansa bırakmak yerine uygulamada tüm anahtarlar için sabitler tanımlamak çok daha akıllıca olacaktır. Session yönetimi için aşağıdaki örnek incelenebilir. Session yönetimini kolaylaştırmak için ilk yapılması gereken bir SessionKeys sınıfının tanımlanması olacaktır.
/// <summary>
/// internal tanımlanma sebebi,
/// tanımlandığı assembly dışında erişilmesini engellemektir.
/// eğer uygulamanın core yapısı farklı bir assemblyde yer alacaksa
/// public tanımlamak gerekecektir.
/// seald tanımlanma sebebi inherit edilmesini engellemektir.
/// </summary>
internal sealed class SessionKeys {
// inctance alınması engelleniyor.
private SessionKeys() { }
/// <summary>
/// oturum açmış kullanıcı'nın ID bilgisi
/// </summary>
public const string USER_ID = "BD9E5B0E";
/// <summary>
/// Kullanıcının tercih ettiği arayüz dili.
/// Oturum açmış veya açmamış kullanıcı için de kullanılabilir.
/// </summary>
public const string CURRENT_LANGUAGE = "F00EA524";
}
Herhangi bir içerikte, session nesnelerine kullanmak için yapılması gereken;
// değer atamak için
Session[SessionKeys.USER_ID]=123;
// değer okumak için
object value = Session[SessionKeys.USER_ID];
Görüldüğü gibi tüm session anahtarları SessionKeys üzerinde tanımlandığında, projedeki tüm içeriklerde sessiona bir nesne atılacağında ve ve/veya bir nesneye erişilmek istendiğinde SessioKeys sınıfında tanımlı anahtarlar kullanılacaktır. Bu sayede aynı session anahtarı farklı yerde, farklı bir amaç için kullanılmasının önüne kısmen de olsa geçmiş olduk. Diğer bir örnekte query stringler için olacaktır. Web uygulamalarında en çok kullanılan yapılardan biri de query stringlerdir, en azından MVC dışındaki yaklaşımlarda bu böyledir. Burada yine bir QueryStringKeys sınıfı tanımlamak işimizi kolaylaştıracaktır. Query String gönderirken ve erişilirken kafamız rahat edecektir.
Bu yaklaşım sadece Asp.Net için değil farklı platformlarda geliştirilmiş tüm web applicationlar için uygulanabilir.