Orta çaplı ya da büyük boyutlu uygulamalarda genellikle uygulama birçok kişi ya da birden fazla takım tarafından geliştirilmekte ve kayank kod kontrolü programları ile ( source safe, cvs, svn gibi ) projelerini yönetmektedirler.Asp.net uygulamalarında, web.config dosyasında  kişilerin ya da takımların kendilerine özel appSettings altında tutacak değerleri veya connectionStrings altında tutacak farklı veritabanı bağlantı bilgileri olabilir. Kimi durumlarda "check out" edilen web.config üzerinde degişiklik yapıldıkdan sonra ( ki bu bazen ekleme bazen de düzenleme olabilir ) "check in" yapılarak tekrar güncellenir. Bu kimi durumlarda birçok hataya ve aksaklığa neden olabiliyor. Bu durumda ilk akla gelen çözüm tüm uygulamada ortak kullanılacak değerler web.config dosyasına konur, test amaçlı, kişiye özel ya da takıma özel kısımlar ise harici bir dosyada tutulara web.config dosyası ile ile ilişkilendirilebilir.

Örneğin A takımının tüm projeden bağımsız kendisine özel bazı değerleri ve yine kendisine özel veritabanı bağlantısı bilgilerini harici olarak tutmak istediğini ama tüm projedeki ortak değerleri ve veritabanı bağlantı bilgilerini de kulanmak istediğini düşünelim. Bu durumda kendisine ait özel verileri web.config haricinde başka bir dosyada tutup, web.config dosyasında da bazı düzenlemelerden sonra diğer takım arkadaşlarının ya da aynı web.config'i kullanan diğer takımların başını ağrıtmayacaktır :)

Resimden de görüldüğü gibi projeme connectionstring lerimi ve appsetting lerimi yerleştirmek için iki ayrı dosya ekledim ( dosya isim ve uzantilarında zorunluluk yoktur. )

Ateam_local_connections.config dosyasının içeriği aşağıdaki gibi;

<connectionStrings>
  <add name="Atakiminaozelbaglanti" connectionString="Atakimi baglanti bilgileri..."/>
</connectionStrings>

Ateam_local_settings.config dosyasının içeriği de

<appSettings>
  <add key="Atakiminaozel" value="beniAtakimiOkur"/>
  <add key="exts" value="jpg,png"/>
</appSettings>

gibidir. web.config dosyamızı da aşağıdaki gibi düzenledikten sonra test edebiliriz.

<appSettings file="Ateam_local_settings.config">
    <add key="globalValue" value="Beni herkes bilir!"/>
</appSettings>
<connectionStrings  configSource="Ateam_local_connections.config">
</connectionStrings>

bu kısımda dikkat edilecek nokta connectionStrings kısmına eğer harici bir dosya kullanacağınızı tanımlarsanız <connectionStrings> tagları arasına başka bir connectionstring tanımlaması yapamıyor oluşunuzdur.

Test kodumuz aşağıdaki gibidir.

    protected void Page_Load(object sender, EventArgs e)
    {
        //genel appSettings okunuyor
        Response.Write(ConfigurationManager.AppSettings["globalValue"]);
        
        //A takimina ozel degerler okunuyor
        Response.Write("<br>"+ConfigurationManager.AppSettings["Atakiminaozel"]);

        //A takimina ozel connectionString okunuyor
        Response.Write("<br>"+ConfigurationManager.ConnectionStrings["Atakiminaozelbaglanti"].ConnectionString);
    }
 

Saç baş yolduran problemsiz çalışma ortamları dilerim :)


 
Categories: Asp.net | Code | Inceleme

July 30, 2008
@ 09:54 AM

BT Akademi 3. yaşına girdi. Gelişen yapısı ve büyüyen iş hacmi ile sektördeki kalitesini daha da artırarak 3. yaşına giren BT Akademi ailesini tebrik ediyorum. Nice nice senelere.

 

 

 

 

 
 
Categories: Yasam

July 30, 2008
@ 09:17 AM

Sevgili Sefer Algan ve Burak Selim Şenyurt ile kısa bir süre önce beğeni ile takip edilen  .NET Radyo'nun 3. ve 4. bölümlerini c#nedir?com da yayınlandı.

3. bölümde ORM ve LINQ konusunda merak edilen ve  sıkça hakkında soru aldığımız Object Relational Mapping kavramı ve LINQ to SQL yaklaşımı üzerinde duruldu. ORM araçlarının amaçları, kullanım alanları , avantaj ve dezavantajları üzerinde durduk.

4.bölümde ise Yeni .Net Kavramları konulu söyleşiyi gerçekleştirdik. .Net Framework 3.0, 3.5, Asp.Net 3.5, Futures, Volta, WCF, WPF, Silverlight, Astoria gibi pek çok kavram üzerinde kısaca durmaya çalıştık. Amaç Microsoft ürünleri ile uygulama geliştiren uzman ya da yeni başlayan geliştiricileri kavram kargaşısından bir nebze de olsa kurtarmayı amaçladık.

Çok kısa bir süre sonra diğer .NET Radyo'ların hazırlanmasına başlayacağımızı belirteyim.


 
Categories: .NET | Inceleme | Yasam

HttpHandler ile sunucuya gelen istekler üzerine işlemler yapabiliyoruz. Eğer belirli bir uzantı üzerinde işlem yapmak istersek ilk akla gelen HttpHandler yazıp uzantıya özel işlemlerimizi yapmaktır. Eğer aynı uzantıya göre birden fazla tanımlanmış HttpHandler'lardan birisinin çalışması istendiğinde (örneğin bir aspx sayfasına gelen isteğe göre birden fazla httphandler tanımlanmış olabilir) ise HttpHandlerFactory ile bunu kolayca halledebiliyoruz. (Factory Design Pattern 'in iyi bir örneği) Örneğin bir site yaptık http://hede/musteriler/x.aspx 'e bir istek geldiğinde ilgili HttpHandler'im, http://hede/urunler/z.aspx 'e bir istek geldiğinde ise birbaşka ilgili HttpHandler'in devreye girmesini isteyebiliriz.

Bu durumu incelemj  için aşağıdaki örneği inceleyebiliriz.

public class Customers : IHttpHandler
   {

       public bool IsReusable
       {
           get { return true; }
       }

       public void ProcessRequest(HttpContext context)
       {
           context.Response.Write("müşteriler sayfaları");
       }
   }
public class Products : IHttpHandler
    {
        public bool IsReusable
        {
            get { return true; }
        }

        public void ProcessRequest(HttpContext context)
        {
            context.Response.Write("ürünler sayfaları");
        }
    }

 

Görüldüğü gibi iki adet httphandler'imiz var. Birisi müşteriler ile iglili aspx sayfaları üzerinde diğeri de ürünlerle ilgili sayfalar üzerinde işlem yapmak amacı ile tasarlanmış httphandler'larımız. Şimdi bizim işimiz gelen isteğe göre hangi httphandler'i devreye sokacağımıza karar vermek.Bu durumda yapacağımız bir IHttpHandlerFactory arayüzünü implemente etmiş sınıf hazırlamak. Örnek aşağıdaki gibidir.

public class facto : IHttpHandlerFactory
    {
        public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
        {
            if (url.Contains("/musteriler/"))
                return new Customers();
            else if (url.Contains("/urunler/"))
                return new Products();
            else
                return new DefaultHttpHandler();
        }
        public void ReleaseHandler(IHttpHandler handler)
        {

        }
    }

Bu interface'i uygulamadığımızda iki metodu implemente etmemiz gerekecek. GetHandler metodu bir aspx (Web.config içinde gerekli ayarlamaların yapıldığını düşünerek) sayfasına istek geldiğinde ilgili HttpHandler'i oluşturup geriye bu nesneyi döndürmeye yarıyor.

Web.config dosyamızda aşağıdaki gibi HttpHandler'imizi eklemeliyiz.

<httpHandlers>
   <add path="*.aspx" type="hndLib.facto" verb="*"/>
</httpHandlers>
      
httphandlerfactory.rar (12,46 KB) (ilgili örnek ektedir)
 
Categories: Asp.net | Code | Inceleme

Kaynak kodları sizde olmayan bir dll'inizin olduğunu düşünün (.net frameworkdeki tüm dll lerin kaynak kodu yok ki zaten bizde) içinde onlarca tip ve bu tiplere ait metodlar, özellikler vs vs. Peki siz " yahu şu xxx tipinin yyy metodu private değil de public olsaydı oh ne güzel tak tak çağırır kullanırdım" diye aklınızdan geçirdiğinizde ilk yapılacak iş Reflection ile private metodu çağırmak olurdu ki, hem kullanması biraz karşık - parametrelerin uyum kontrolu, tip kontrolü, koddaki kirlilik de cabası - hem de performans sorunundan dolayı tam düşüncelerimizdeki o "sadeliği :) " gerçekleyemiyor :))  o zaman yapılacak iş dll'i açık private metodu public yapıp sonra aynı dll'i bozmadan tekrar kaydetmek... Bu işi yapan çok güzel bir aracı sizlere tanıtmak istiyorum...

Şurdaki adresten edinebileceğimiz aracı kurdukdan sonra test amaçlı bir dll projesi oluşturup public ve private üye elemanlar içeren bir tip ekleyip dll'i oluşturalım.

using System;
using System.Collections.Generic;
using System.Text;

namespace DllEditTest
{
    public class DummyObject
    {
        public string GetXml()
        {
            return "<xml>";
        }

        private void Cagiramazsinki()
        {

        }
    }

    class SecretObject
    {
        private int _price;
        public int Price
        {
            get { return _price; }
            set { _price = value; }
        }
    }
}

Örnek Dll'i test edecek bir uygulama oluşturup, kullandığımızda SecretObject isimli tipe beklediğimiz gibi erişmediğimizi görürüz.

Yine beklediğimiz gibi DummyObject sınfından bir nesne oluşturduğumuzda  Cagiramazsinki isimli private metodun görünmediğini görürüz.

 

Şimdi CFF Explorer uygulamasını başlatıp ilgili dll'i bu uygulama ile düzenlemek için ( File -> Open ) açalım. Aşağıdaki resimdeki gibi dll'in içerisindeki erişilebilen tipin metod bilgilerine erişelim.Dikkat ederseniz sadece erişilebilen public metodlarının listelendiğini göreceksiniz. Listeden Cagiramazsinki isimli private metodu seçtip sağ kısımda Flags satırının en sonunda "Click Here" yazan yere tıkladığınızda metodun özellikleri çıkacaktır. Bu kısımda "public" seçeneğini seçip dialog penceresini kapatıp, dll'imizi kaydediyoruz.

Tekrar dll'i test ettiğimz örnek uygulamamıza dll i eklediğimizde artık bu metodun da çağrılabildiğini göreceğiz.

 

Yine benzer şekilde TypeDef node'undan SecretObject'i seçip Flags kısmından sınıfımızı public olarak işaretleyip dll imizi kaydettikden sonra bu sınıfa da test projemizden erişilebildiğini görürüz.

Böylelikle bir dll in tüm özelliklerini değiştirirek kendimize özel hale getirip kullanabiliriz. Tabi ki iyi niyetle, tüm bu çabaların daha iyi uygulama geliştirme amaçlı olduğunu aklımızdan çıkarmadan değil mi ? :))))) Daha fazla bilgi için bu yararlı aracın sayfasından yararlanabilirsiniz.

Bir sonraki yazımda da yine iyi niyetli düşüncelerimizi gerçekleştirmek için neler yapabileceğimizi inceleyeceğiz.


 
Categories: .NET | Inceleme

Kod yazarken mouse kullanmayı sevmyenler için klavye kısa yolları önem kazanmaktadır( ayrıca kod yazmakda hız kazandırdığı da gayet açıktır) Hoşuma giden bir o kadar da az bilinen bazı kısayolları sizlerle paylaşmak istedim.

1- Kod yazarken birçok kez kopyalama işlemi yapıyoruz. Daha önce kopyalanan kodu,  2. kopyalama (ctrl + c) işleminden sonra kaybetmiyormuşuz :) yani vs arkaplanda kopyalanan kodları tutuyormuş. Ctrl + Shift + V ile bu kopyalanan kodlar arasında gezebiliyoruz.

Daha önceden kopyalanmış bir kodu yapıştırmak istediğimizde ctrl + shift +v tuş kombinasyonuna birden çok kez bastığımızda daha önceden kopyalanmış kodları da görebiliyoruz

2- Namespace'ini bilmediğimiz ya da o anda hatıryalamadığımız bir Type'in ismini doğru şekilde yazdığımızda type'in isminin hemen altında küçük kırmızı bir simge çıkararak, vs.net bize iki öneride bulunmaktadır. İster o anda direk namespace ismi ile kullanmayı, istenirse de using ifadesi ile kodun başına namespace'i eklemeyi önermekedir. Bu menüyü klavyeden elinizi kaldırmadan görebilmek için Ctrl + . tuş kombinasyonunu kullanabilirsiniz. (Teşekkürler Mustafa Güven :) )

 

3- Uzun metodlarda ya da sınıf tanımlamarında açılan ve kapanan küme parantezleri (braces) arasında dolaşmak için Ctrl + ] tuş kombinasyonunu kullanabilirsiniz.


 
Categories: .NET | Inceleme