C# ile Dependency Injection ve Loosely Coupling

By Burak TUNGUT - 6.5.2013 - 1 Yorum - Kategori C#

Düzgün ve detaylı bir analiz yapılmadan geliştirme sürecine geçilmiş bir çok projenin eninde sonunda başvurduğu nadide yöntemlerden biridir Dependency Injection.

Dependency Injection ve Loosely Coupling Genellikle geliştirme sürecinde ihtiyaç duyulan gereksinimlere göre yapılan projelerde bir sorun görülmese de, zamanla ihtiyaçların artacağı ve sıkı bağlı tipler ile geliştirilmiş projelerde ciddi sıkıntılar yaşanabilmektedir.

Az önce güzel bir anahtar kelimeden bahsetti; sıkı bağlı!
Aslında biz bu anahtar kelimeden ziyade, bunun tam tersi ile ilgileniyor olacağız. Yani; gevşek bağlı (Loosely Coupled).

Gevşek bağlı tipler ile çalışmanın en büyük faydası projenin ilerleyen zamanlarda gelişime açık ve rahatça revize edilebilmesidir.

Konuyu ilk hakimiyeti sağlamanın en güzel yolu kanımca göresellerdir. Bunun için yandaki gibi fareye bağımlı olmuş bir insan elini örnek alabiliriz smiley

Günlük Hayattan Bir Senaryo

Bir proje yapıyor olalım. Bu projenin bir aşamasında da kullanıcının fareyi ara bir tip ile kullanması gerektiğiniz düşünelim.

Proje tahmin edileceği üzere düzgün bir şekilde analiz edilmediği için farenin hiç bozulmayacağı ya da fareden beklenen ihtiyaçların hiç değişmeyeceği düşünüldü. Bu nedenle de sokakta görülen ilk bilgisayarcıdan bir fare alındı ve kullanıcının eline tıpkı resimde olduğu gibi verildi smiley

Bir müddet sonra fark ettik ki elimizdeki fare artık bizim ihtiyaçlarımızı karşılayamıyor. Bu durumda akla gelen ilk çözüm o fareyi atıp, yerine yeni bir fare almak olacaktır. Tabi ki yazılım geliştirme ve revize işlemlerindeki süreçler ne yazık ki günlük hayattan verdiğimiz bu örnekteki gibi olmuyor blush

Senaryonun Yazılım Tarafı

Şimdi ise düşündüğümüz bu senaryoyu C# ile uygulamaya dökelim. Bunun için LogitechMouse adlı bir sınıf tasarlıyor ve içerisinde ekrana kullanılan farenin markasını yazacak Write adlı bir metod yazıyorum.

class LogitechMouse
    {
        public void Write()
        {
            Console.WriteLine("Logitech Mouse Kullanıldı");
        }
    }

Bir de mouse ile kullanıcı arasındaki entegrasyonu sağlayacak ara bir sınıf daha yazıyorum. Bu sınıfımızın adı da MouseManager şeklinde olsun ve içerisindeki Use metodu tetiklendiğin de bir adet LogitechMouse sınıfından instance alsın ve Write metodunu tetiklesin.

Devamı

Eskişehir Osmangazi Üniversitesi The Code Day Etkinliğimiz

By Burak TUNGUT - 4.5.2013 - Kategori Genel

Yazılım Dilleri olarak yıl içerisinde yaptığımız bir çok The Code Day etkinliğini bu haftasonu da Eskişehir Osmangazi Üniversiteinde gerçekleştirdik!

Veysel Uğur KIZMAZ ile beraber gerçekleştirdiğimiz etkinlikte genel olarak Windows Azure, Asp.Net MVC ve uygulamalarından bahsettik.

Eskişehir Osmangazi Üniversitesi Burak TUNGUT

İlk oturumlarda biz aday mühendisler için sektör hakkında bolca bilgi veren Veysel Uğur KIZMAZ ile ilerleyen saatlerde çekilişler ile bir çok öğrenci arkadaşa kitaplarını verdik.

Devamı

Asp.Net MVC Output Cache Kullanımı ve İstisna Senaryoları

By Burak TUNGUT - 24.3.2013 - 2 Yorum - Kategori Asp.Net MVC

Öncelikle herkese merhabalar smiley Bu makalemde Asp.Net MVC uygulamalarında sıklıkla kullanılan bir önbellekleme yöntemi olan OutputCache filter’ının kullanımını inceliyor olacağız. Web projelerinin en büyük sıkıntıları hiç şüphesiz performans kayıplarıdır. Bunu büyük ölçüde absorbe  etmek içinde doğru yerlerde olma şartıyla caching işlemleri yapılır.Asp.Net MVC Output Cache

Örneğin günde yüzbinlerce kişinin girdiği, hepsiburada.com gibi bir siteyi ele alalım. Kategoriler arasında dolaşıyor, ürünleri inceliyor ve sipariş veriyorsunuz. Ancak hangi sayfada olursanız olun üst tarafta kategorileri hep görüyorsunuz. Yüzbinlerce kişinin bu sitede en az 3 sayfayı gezdiğini bile düşünürseniz kategoriler kısmının her seferinde veri tabanından çekiliyor olması büyük performans kayıpları yaşatacaktır.Sonuçta bu kısım an ve an değişiklik gösterebilen bir bölüm değil. Böyle bir siteye kategori eklenmesi belki birkaç ayda bir gerçekleşir.

Sonuç itibariyle böyle bir durumda yani kısa süreçler içerisinde değişime uğramayan veya anlık bilgi üretmeyen kısımların önbelleklenmesi (caching) büyük ölçüdeki performans kayıplarını bir hayli absorbe edecektir.

Bunun yanı sıra az önce “anlık bilgi üretmeyen…” kısmıyla da belirttiğim gibi durumlarda ise caching yapılması mümkün olup, istenilen sonuçların doğru üretilebilmesi çeşitli konfigürasyonlar ile sağlanabilmektedir.

Caching Çeşitleri

Caching işlemlerini Data Caching ve Output Caching olmak üzere ikiye ayırabiliriz.
Data Cache işlemleri .Net üzerinde, desteklediği tüm veri ve referans tiplerini ön bellekleyebileceğimiz ve her bir istekte ise önbellekten aynı veriyi alabileceğimiz bir model sunar. Böyle bir önbellekleme için yukarıda verdiğimiz örneği ele alırsak, veri tabanına bir kere bağlanılır ve çekilen kategori nesneleri data cache ile ön belleklenebilir.

Makalede inceleyeceğimiz Output Cache modeli ise çıktıların yani render edilmiş View bilgilerinin ön belleklenmesini ve timeout olana kadar gelen her bir istekte ise bir önceki ön belleklenmiş bilgilerin sunulmasını sağlar. Aynı örnek üzerinden ilerleyecek olursak output cache ile kategoriler kısmının ön belleklenmesi için kategoriler kısmını içeren bir PartialView’ın tamamının cache edilmesi gerekir.

Anlık değişim içerisinde olmayan bir çok verinin aynı sayfa üzerinde olacağı durumlarda, toplu bir cache mekanizmasına sahip olduğu için Output Cache kullanımı daha tutarlı bir çözüm olacaktır.

Cache yöntemlerinden ve istisna durumlarından da bahsettiğimize göre artık yapacağımız küçük uygulamalara geçebiliriz laugh

OutputCache kullanım kolaylığı sağlanması için Action Filter sınıfından kalıtılmıştır. Bu sayede Controller veya altında oluşturulabilecek Action’lar için Attribute olarak kullanılabilirler.

OutputCache Attribute'ün Kullanımı

Uygulamalarımızı yapabilmek için bir adet Asp.Net MVC 3 ya da 4 projesi açalım.
HomeController altında GetTime adında bir adet action yaratalım ve aşağıdaki gibi kodlayalım;

namespace MVCAuth.Controllers
{
    public class HomeController : Controller
    {
        [OutputCache(Duration=10)]
        public ActionResult GetTime()
        {
            ViewBag.Date = DateTime.Now.ToString();
            return View();
        }
    }
}

Devamı

Asp.Net MVC - IExceptionFilter Implementasyonu İle Hata Yakalama

By Burak TUNGUT - 9.3.2013 - 1 Yorum - Kategori Asp.Net MVC

Herkese merhabalar. Yaklaşık 2 haftadır yazmayı hatta yazacağımda uygulamak istediğim senaryoyu bile kafamda tasarladığım makalem ile karşı karşıyayız cool Geçtiğimiz 3 ay boyunca MVC patterni üzerine yoğunlaşmama rağmen bu alanda makale paylaşımlarımın eksik olduğumu gözlemledim. Aslında amacım Asp.Net MVC için düzenli ilerleyecek bir yazı dizisi hazırlamaktı fakat bu alandaki ilk makalemin başlığı, “Asp.Net MVC - Arama Motoru Dostu linkler için Custom Link Senaryosu” şeklinde olunca giriş seviyesi konuları biraz atlamış oldum cheeky

C# ile Web Forms ya da MVC olsun herhangi biri ile web projesi geliştiren herkes eminim ki aşağıdaki manzara ile karşılaşmıştır;

Asp.Net MVC Exception

“Kahretsin!! Evettt” diyenleri duyar gibiyim J Sarı arka plan üzerine kurulmuş şu sayfayı gördüğümüzde hiç şüphesiz işlerin ters gittiği kesindir. Birde son müşteri için hizmete açılmış bir projede böyle bir şeyin olduğunu hayal edelim. Ya da vazgeçtim. Hayal etmesek daha iyi gibi. Pekte güzel bir hayal olmadı blush Tabi ki bu hayali daha doğrusu kabusun yaşanmaması için bir şeylerin yapılması gerekir.

Senaryomuzu Tanıyalım

Aslında yapılması gereken olgu için ipucunu daha önce verdim (Bknz.: Makale Başlığı). Asp.Net MVC platformunun bizler için sunduğu çeşitli hata ayıklama mekanizmaları mevcut.  Aklıma gelenler için bunları şöyle sıralıyabiliriz;

1.       Application_Error metodunun yazılması

2.       IExceptionFilter interface’ini implemente eden bir filter yazılması

3.       IIS Custom Error kullanılması

Aklıma gelen bu üç yöntemden OOP tekniklerine daha yatkın olduğu için ikincisini tercih ettim.

Bugünkü senaryomuz olabildiğince basit. Elimizde bir web projesi var. Ana sayfasında ise sadece “Hata Fırlat” ismine sahip ve tıklandığında ise Exception fırlatacak bir link olsun. Tabi ki bu linke tıklandığında daha önce herhangi bir hata yakalama işlemi yapılmadığı için, yukarıda lanetler okuduğumuz sarı arka planları bir sayfa ile karşılaşıyor oluruz.

Projeyi uygulamaya geçirme işlemine, controller ve action’lardan başlayalım. Bunun için içi boş bir MVC projesi oluşturalım ve HomeController altına Index, Throw ve Error adlı üç adet ActionResult ekleyelim.  Index adlı ve Error adlı actionlar için birer view oluşturalım. Throw adlı action için herhangi bir view oluşturmayalım. Hata fırlatacak action’ın view ile ne işi olur laugh

HomeController Sınıfının Kodları

public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Throw()
        {
            throw new Exception("Ben Fırlatırım, Sen Yakalarsın!");
        }

        public ActionResult Error()
        {
            return View();
        }
    }

Yukarıda bahsettiğimiz gibi Throw action'ının bir view'e bağlanması gereksizdir. Dikkat ederseniz herhangi bir return işlemide bu metot içerisinde uygulanmamıştır. Hatta Visual Studio varsa return sözcüğünün bizim için gereksiz olduğunuda söyleyecektir.

Devamı

Asp.Net MVC - Arama Motoru Dostu linkler için Custom Link Senaryosu

By Burak TUNGUT - 26.1.2013 - 3 Yorum - Kategori Asp.Net MVC

Öncelikle herkese merhabalar :) Yaklaşık 2 aydır aşırı tempolu geçen bir dönem içerisindeydim. Neyse ki dersler, projeler derken sonun da hepsini atlattım. Tabi tatil dönemini yarılamış olmamda beni bir hayli üzüyor. Bazen sormuyor değilim kendime zaman ne çabuk geçti diye J

Neyse artık yavaş yavaş  bugünkü konumuza gelelim.

Uzun zamandan beri Asp.Net MVC hakkında bir yazı dizine başlamak istiyordum. Bu başlangıcı aslında geçtiğimiz haftalarda Asp.Net MVC Giriş adlı webiner ile yaptım. Bu günkü konumuz ise View tarafında Link işlemlerinin nasıl yapılacağı olacak.  Bunun yanında Helper sınıflar için extension metotlar yazarak kendimize özel (Custom) Link’ler yaratılmasını sağlayacağız.
Tüm bunları yaparken örneğin teoride kalmaması için biraz Routing ayarlaması ile de uğraşacağız tabi ki :)

Senaryomuzu Tanıyalım

Bugün yapacağımız örnekleri bir Haber sayfası senaryosu üzerinden yapacağız. Bunun için öncelikle her ne kadar var olmasa da News adında bir veri tabanı tablomuzun olduğunu düşünelim ve bu tabloyu bir entity class niteliğinde modelleyelim.

Model klasörümüz altında bir adet sınıf oluşturalım ve modelleme işlemimizi aşağıdaki kodlar yardımıyla gerçekleştirelim;

public class News
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }
    }

Deneme amaçlı olarak kullanacağımız ve elimiz ile birkaç haber kaydı ekleyeceğimiz için sade bir model oluşturamaya özen gösterdim.

Haber Depomuza Kayıtlarımızı Ekleyelim

Az önce bahsettiğim gibi az da olsa birkaç kayıt uygulamamızı çalışır hale getirmek için yeterli olacaktır. Bunun için News sınıfı içerisinde Repository adında bir property tanımlayalım. Bu property bizlere ekleyeceğimiz 10 adet haber kaydını sunsun. Bu durumda tipimiz bir collection olacaktır. Fakat her ulaştığımızda tekrar tekrar bu işlemi yapmaması için küçük bir encapsulation uygulamakta fayda var.

Dediklerimizi şöyle toparlayalım o zaman. Biri public diğeri private olan iki adet static property tanımlayalım ve haber kayıtlarını ilk çalışma anında yükleyecek bootstrap tadında bir metot yazalım.

O zaman News sınıfımızın içerisine aşağıdaki kod parçalarını da ekleyelim;

private static IList<News> _Repository = null;
        public static IList<News> Repository
        {
            get
            {
                if (_Repository == null)
                    _Repository = GetNews();
                return _Repository;
            }
        }

        private static IList<News> GetNews()
        {
            var result = new List<News>();
            for (int i = 1; i <= 10; i++)
            {
                result.Add(new News
                {
                    Id=i,
                    Title=string.Format("{0}. Haberin Başlığı",i),
                    Content = string.Format("{0}. Haberin İçerik Detayı")
                });
            }
            return result;
        }

Devamı
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Facebook
Son Yorumlar