<?xml version="1.0" encoding="windows-1254"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arda Çetinkaya &#187; C#</title>
	<atom:link href="http://www.minepla.net/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.minepla.net</link>
	<description>Yazılım ve geri kalan her şey ile ilgili arada saçmaladıklarım...</description>
	<lastBuildDate>Fri, 09 Dec 2011 08:42:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Nedirtv.com Aralık ayı webinerleri&#8230;</title>
		<link>http://www.minepla.net/2011/12/nedirtv-com-aralik-ayi-webinerleri/</link>
		<comments>http://www.minepla.net/2011/12/nedirtv-com-aralik-ayi-webinerleri/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 19:57:43 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[Etkinlik]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=1704</guid>
		<description><![CDATA[Kasım ayı ile uzun sessizliğini bozan Nedirtv.com etkinlik serisi, Aralık ayında daha fazla konu ile devam ediyor. Aralık ayının kesinleşen programı aşağıdaki gibi&#8230;İlgilendiğiniz konuları kaçırmayın derim&#8230; Konu: Entity Framework ile Gerçek Hayat Örnekleri-1 Tarih: 12 Aralık 2011 Pazartesi &#8211; 21:00 Link: https://www.livemeeting.com/cc/mvp/join?id=Z3THGT&#38;role=attend Konuşmacı: Burak Selim ŞENYURT Konu: Entity Framework ile Gerçek Hayat Örnekleri-2 Tarih: 13 Aralık [...]]]></description>
			<content:encoded><![CDATA[<p>Kasım ayı ile uzun sessizliğini bozan Nedirtv.com etkinlik serisi, Aralık ayında daha fazla konu ile devam ediyor. Aralık ayının kesinleşen programı aşağıdaki gibi&#8230;İlgilendiğiniz konuları kaçırmayın derim&#8230;</p>
<p><strong>Konu:</strong> Entity Framework ile Gerçek Hayat Örnekleri-1<br />
<strong>Tarih:</strong> 12 Aralık 2011 Pazartesi &#8211; 21:00<br />
<strong>Link:</strong> <a href="https://www.livemeeting.com/cc/mvp/join?id=Z3THGT&amp;role=attend" rel="nofollow nofollow" target="_blank">https://<wbr>www.livemeeting.com/cc/mvp/</wbr><wbr>join?id=Z3THGT&amp;role=attend</wbr></a><br />
<strong>Konuşmacı:</strong> Burak Selim ŞENYURT</p>
<p><strong>Konu:</strong> Entity Framework ile Gerçek Hayat Örnekleri-2<br />
<strong>Tarih:</strong> 13 Aralık 2011 Salı &#8211; 21:00<br />
<strong>Link:</strong> <a href="https://www.livemeeting.com/cc/mvp/join?id=8FPTD6&amp;role=attend" rel="nofollow nofollow" target="_blank">https://<wbr>www.livemeeting.com/cc/mvp/</wbr><wbr>join?id=8FPTD6&amp;role=attend</wbr></a><br />
<strong>Konuşmacı:</strong> Burak Selim ŞENYURT</p>
<p><strong>Konu:</strong> CRM 2011 Programlama Teknikleri<br />
<strong>Tarih:</strong> 19 Aralık 2011 Pazartesi &#8211; 21:00<br />
<strong>Link: </strong><a href="https://www.livemeeting.com/cc/mvp/join?id=9N5553&amp;role=attend" rel="nofollow nofollow" target="_blank">https://<wbr>www.livemeeting.com/cc/mvp/</wbr><wbr>join?id=9N5553&amp;role=attend</wbr></a><br />
<strong>Konuşmacı:</strong> Barış KANLICA</p>
<p><strong>Konu:</strong> Cambaz Debugger &#8211; C# Uygulamalarında Hata Ayıklama<br />
<strong>Tarih:</strong> 24 Aralık 2011 Cumartesi &#8211; 21:00<br />
<strong>Link:</strong> <a href="https://www.livemeeting.com/cc/mvp/join?id=SP7FZ9&amp;role=attend&amp;pw=5%2BK7Hd5cW" rel="nofollow nofollow" target="_blank">https://<wbr>www.livemeeting.com/cc/mvp/</wbr><wbr>join?id=SP7FZ9&amp;role=attend&amp;</wbr><wbr>pw=5%2BK7Hd5cW</wbr></a><br />
<strong>Konuşmacı:</strong> Fatih BOY</p>
<p><strong>Konu:</strong> C#&#8217;ın Geleceğine Bir Bakış<br />
<strong>Tarih:</strong> 26 Aralık 2011 Pazartesi &#8211; 21:00<br />
<strong>Link:</strong> <a href="https://www.livemeeting.com/cc/mvp/join?id=NJD5T2&amp;role=attend&amp;pw=3%229Z%3CTp%2CW" rel="nofollow nofollow" target="_blank">https://<wbr>www.livemeeting.com/cc/mvp/</wbr><wbr>join?id=NJD5T2&amp;role=attend&amp;</wbr><wbr>pw=3%229Z%3CTp%2CW</wbr></a><br />
<strong>Konuşmacı:</strong> Fatih BOY</p>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2011/12/nedirtv-com-aralik-ayi-webinerleri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MEF 2.0 Preview 4 yayınlandı&#8230;</title>
		<link>http://www.minepla.net/2011/10/mef-2-0-preview-4-yayynlandy/</link>
		<comments>http://www.minepla.net/2011/10/mef-2-0-preview-4-yayynlandy/#comments</comments>
		<pubDate>Fri, 28 Oct 2011 08:18:40 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MEF]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=1693</guid>
		<description><![CDATA[MEF&#8217;in(Managed Extensibility Framework) geliştirmesi devam eden 2.0 sürümünün Preview 4&#8242;ü yayınlandı. Diğer Preview&#8217;lara nazaran büyük yenilikler içeren bu yeni sürümü, MEF ile ciddi anlamda uğraşan kişilere tavsiye ederim. İndirmek için bu adrese gitmeniz yeterli. Kısaca benim neler en çok hoşuma gitti onlardan bahsetmek isterim, belki daha cazip gelir bu haber bu sayede (: Benim en [...]]]></description>
			<content:encoded><![CDATA[<p>MEF&#8217;in(Managed Extensibility Framework) geliştirmesi devam eden 2.0 sürümünün Preview 4&#8242;ü yayınlandı. Diğer Preview&#8217;lara nazaran büyük yenilikler içeren bu yeni sürümü, MEF ile ciddi anlamda uğraşan kişilere tavsiye ederim. İndirmek için <strong><a href="http://mef.codeplex.com/releases/view/75766" target="_blank">bu adrese</a></strong> gitmeniz yeterli.</p>
<p>Kısaca benim neler en çok hoşuma gitti onlardan bahsetmek isterim, belki daha cazip gelir bu haber bu sayede (:</p>
<p>Benim en çok hoşuma giden yenilik MEF Part&#8217;larını belirtmek için kullandığımız attribute&#8217;ları yeni gelen <em><strong>RegistrationBuilder</strong></em> ile sayesinde farklı bir şekilde belirtebiliyor olmamız. Mesela belli bir sınıfta belirtilen Part&#8217;larımızdan türüyen export edilecek diğer sınıflarımız için <strong>[Export]</strong> attribute&#8217;unu tanımlamak gerekmekteydi. Hem kendini tekrarlayan bir yapı oluşmasıns sebep olan hem de bazen unutulabilen ve  runtime&#8217;da fark edilebilen bir durum oluyordu. Yeni gelen RegistrationBuilder ile aşağıdaki gibi Export edilecek Part&#8217;larımı daha kolay ve anlaşılır bir şekilde tanımlayabiliyoruz.</p>
<pre class="brush: csharp; title: ; notranslate">
 //ForTypesDerivedFrom() metodu ile BaseModule gibi kendi sınıfımızdan
 //türümiş tüm objelerin export edilebileceğini söylüyoruz.
 var builder = new RegistrationBuilder();
 builder.ForTypesDerivedFrom().Export();

//MEF kataloglarına da RegistrationBuilder objemizi verebiliyoruz
 var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly(), builder);
 </pre>
<p>Generic olan sınıfları artık Export edebiliyoruz. Yani<em> IGenericType&lt;T&gt;</em> gibi bir arayüzümüz olduğunda ve bundan türeyen sınıflarımızı Export etmek istediğimiz de<strong> [Export(IGenericType&lt;&gt;)]</strong> şeklinde attribute&#8217;u güncellemek yeterli olacak.</p>
<p>Ayrıca Exception mesajlarında ki iyileştirmeler de Run-time&#8217;da alınan hataları biraz daha açıklayıcı hala getiriyor. Bu da hata tespiti için çok can kurtaracak.</p>
<p>Bu arada MEF 2.0 versiyonu, .NET Framework 4.5&#8242;ün içinde de geliyor olacak. Ama tabi ondan önce çıkar mı bilemiyorum&#8230;Çıkarsa ne ala&#8230;Neyse şimdilik bu kadar&#8230;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2011/10/mef-2-0-preview-4-yayynlandy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IObserver ve IObservable ile biri bizi gözetliyor&#8230;</title>
		<link>http://www.minepla.net/2011/10/iobserver-ve-iobservable-ile-biri-bizi-gozetliyor/</link>
		<comments>http://www.minepla.net/2011/10/iobserver-ve-iobservable-ile-biri-bizi-gozetliyor/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 13:52:53 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Design Patterns]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=1677</guid>
		<description><![CDATA[Çok uzun bir ara vermiştim fark etmiş olduğunuz üzere&#8230;Ama şimdi kaldığım yerden devam ediyor ve fazla uzatmadan hemen bu yazının konusuna geliyorum&#8230; .NET Framework 4.0 ile gelen iki yeni arayüzü kısaca anlatmaya çalışacağım. IObservable&#60;T&#62; ve IObserver&#60;T&#62; yeni gelen arayüzlerimizden&#8230;Bu arayüzler “push-based notifications” diye literatürde yer alan sistemler oluşturmamız için faydalanabileceğimiz arayüzler. “push-based notifications” nedir ile [...]]]></description>
			<content:encoded><![CDATA[<p>Çok uzun bir ara vermiştim fark etmiş olduğunuz üzere&#8230;Ama şimdi kaldığım yerden devam ediyor ve fazla uzatmadan hemen bu yazının konusuna geliyorum&#8230; .NET Framework 4.0 ile gelen iki yeni arayüzü kısaca anlatmaya çalışacağım.</p>
<p><strong><a href="http://www.minepla.net/wp-content/uploads/fringe-the-observer.jpg"><img class="size-full wp-image-1678 alignleft" title="fringe-the-observer" src="http://www.minepla.net/wp-content/uploads/fringe-the-observer.jpg" alt="" width="240" height="231" /></a>IObservable&lt;T&gt;</strong> ve <strong>IObserver&lt;T&gt;</strong> yeni gelen arayüzlerimizden&#8230;Bu arayüzler “push-based notifications” diye literatürde yer alan sistemler oluşturmamız için faydalanabileceğimiz arayüzler. “push-based notifications” nedir ile başlasak sanırım daha kolay olacak bazı şeyler. Artık bir çok kişinin kullandığı sosyal paylaşım sitelerinden örnekler verebiliriz daha iyi anlamak için. Facebook’da örneğin, sayfa ile her hangi bir etkileşim olmadan zaman zaman sağdan soldan “1 tane mesajınız var”, “X kişisi Y’nin fotoğrafını beğendi” gibi bildirimler alıyoruz. Bu tarz bildirimlere “push-based notifications” diyoruz. Türkçeleştirmek için kasamadım açıkcası ama basitçe bir nesnenin, kendisine bağlanan ya da üye olan parçalara bildirimler göndererek, kendinde olan değişimleri bildirmesi olarak açıklayabiliriz. Gözlemci ve gözlenen olarak düşünürsek biraz daha netleşebilir sanırım. Bütün bu kavramlar aslında mevcut event yaklaşımı ile üstü kapalı olarak bize sunulmakta tüm yazılım geliştirme dillerinde. Ayrıca “Observer” tasarım kalıbı şeklinde de literatürde yerini uzun süredir korumakta.<br />
<span id="more-1677"></span><br />
<strong>IObservable</strong> ve <strong>IObserver</strong> arayüzleri de bu tasarım kalıbının .NET Framework’de ki yansıması. Peki neden yeni olarak .NET Framework 4.0 ile geldi ya da mevcut event yapısı zaten bu kavramları karşılamıyor mu sorularını sorabilirsiniz&#8230;Gelişen ihtiyaçlar ve kullanıcı eğilimlerinden dolayı asenkron çağrılar ve dağınık olay bazlı(distrubted events) yaklaşımları kendi sistemlerimizde, kendimize özgün yöntemler ile kullanmamız gerekebiliyor. Bundan dolayı bu iki arayüz ile daha kontrollü bir şekilde kendi “push-based notification” tarzı uygulamalarımızı .NET Framework ile daha kolay geliştirebiliyoruz. Bir örnek ile devam edip biraz daha netleştirelim.Yabacağımız örnek basit bir konsol uygulaması olup, doların yükselişini simule eden ve bu yükselişi takip eden bir uygulama olacak. Oldukça basit&#8230;Yine standart olarak kod üzerinden açıklamalar ile anlatmaya çalışacağım. O zaman başlıyoruz&#8230;</p>
<pre class="brush: csharp; title: ; notranslate">
    //IObservable arayüzünden gözlemnecek nesnemizin sınıfı yaratıyoruz.
    //T tipindeki nesne yarattığımız nesne ya da daha temel bir nesne olabilir.
    //IObservable arayüzünden türüyen sınıf, arayüzden gelen Subscribe()
    //metodunu tanımlamak durumda. Bu metod ile bu nesnemizi gözleyecek
    //nesneleri tanımlıyoruz.
    public class Dolar : IObservable
    {
        //Nesnemizi birden fazla gözlemci gözleyebileceği için
        //List tipinde bir nesne ile gözlemcileri saklayabileceğimiz
        //bir koleksiyon tanımlıyoruz.
        private List&gt; _subscribers;
        private int _amount;

        public Dolar()
        {
            _subscribers = new List&gt;();
        }

        public int Amount
        {
            get
            {
                return _amount;
            }
            set
            {
                _amount = value;
                //Nesnemizde oluşacak değişiklikleri gözlemcilere,
                //gözlemcilerin(-ki bunlar IObserver arayüzünden
                //yaratılan sınıflar) OnNext() metodu ile bildiriyoruz.
                foreach (var item in _subscribers)
                {
                    item.OnNext(this);
                }
            }
        }

        //Subscribe metodu IObservable arayüzünden gelen bir metod.
        //Bu metod ile nesnemizi gözlemleyecek diğer nesneleri belirtebiliyoruz.
        //Bir başka deyişle nesnemize abone olacak ve onun değişikliklerinden
        //etkilenecek olan nesneleri alıyoruz.
        //IDisposable tipinde bir dönüş değeri olmasının sebebi, gözlemcilerin
        //gerektiği zaman aboneliklerini iptal ettirebilmelerini sağlıyor.
        //Bu örnekte bu konuya değinmedim.Belki ileride
        public IDisposable Subscribe(IObserver observer)
        {
            if (!_subscribers.Contains(observer))
                _subscribers.Add(observer);

            return null;
        }
    }
</pre>
<p>Gözlenecek nesnemizin sınıfı oluşturduktan sonra, bu nesne üzerindeki değişiklikleri takip ve kontrol edeceğimiz, gözlemci nesnelerimizin sınıflarını aşağıdaki gibi yazabiliriz.</p>
<pre class="brush: csharp; title: ; notranslate">
    //Aşağıdaki örnek sınıfta, IObserver arayüzünden yarattığımız nesne
    //CurrencyTracker nesnesi, Dolar tipinde ki nesneleri gözlemleyecek.
    //IObserver arayüzünden gelen 3 tane zorunlu metod var.
    //OnNext() metodu ile değişen datayı gözlemciye bildiriyoruz,
    //OnError() metodu ile hata oluştuğu durumları gözlemciye bildirebiliyoruz,
    //OnCompleted() metodu ile de bildirimlerin tamamlandığı bilgisini verebiliyoruz.
    public class CurrencyTracker : IObserver
    {
        public CurrencyTracker()
        {

        }

        public void OnCompleted()
        {
            Console.WriteLine(&quot;İşlem Tamamlandı&quot;);
        }

        public void OnError(Exception error)
        {
            Console.WriteLine(&quot;Hata oluştu&quot;);
        }

        public void OnNext(Dolar value)
        {
            Console.WriteLine(&quot;Dolar'ın değeri:{0} &quot;,value.Amount);
        }
    }

    //Bu örnek için, yukardaki diğer gözlemciye benzeyen başka bir
    //gözlemci, aynı mantıkla çalışmakta.Ek olarak OnNext() metodunda
    //gelen veri değerini kontrol ediyor.
    public class LimitTracker : IObserver
    {

        public LimitTracker()
        {

        }

        public void OnCompleted()
        {
            Console.WriteLine(&quot;İşlem Tamamlandı&quot;);

        }

        public void OnError(Exception error)
        {
            Console.WriteLine(&quot;Hata oluştu&quot;);
        }

        public void OnNext(Dolar value)
        {
            if(value.Amount&gt;70)
                Console.WriteLine(&quot;Dolar'ın değeri çok yüksek: {0} .Kriz olabilir.&quot;, value.Amount);
        }
    }
</pre>
<p>Son olarak ise yazdığımız kodların nasıl çalıştığını görmek adına aşağıdaki gibi basit bir konsol uygulaması yazıyoruz.</p>
<pre class="brush: csharp; title: ; notranslate">
    class Program
    {
        static void Main(string[] args)
        {

            Dolar d = new Dolar();
            CurrencyTracker ct = new CurrencyTracker();
            LimitTracker lt = new LimitTracker();

            //Dolar nesnemize abone oluyoruz ve gözlemlemeye başlıyoruz
            d.Subscribe(lt);
            d.Subscribe(ct);

            //1000 milisaniye de bir Dolar tipindeki nesnemizin Amount değerini
            //değiştiriyoruz.
            Timer t = new Timer((s) =&gt;
            {
                d.Amount = new Random().Next(100);
            }, null, TimeSpan.FromMilliseconds(1), TimeSpan.FromMilliseconds(1000));

            Console.ReadLine();
        }
    }
</pre>
<p>Örnek uygulamamızın çıktısı da aşağıdaki gibi olacaktır&#8230;</p>
<p><a href="http://www.minepla.net/wp-content/uploads/Capture.jpg"><img class="aligncenter size-full wp-image-1683" title="Observer" src="http://www.minepla.net/wp-content/uploads/Capture.jpg" alt="" width="689" height="350" /></a></p>
<p>Şimdilik bu kadar&#8230;Oldukça basit bir örnekle .NET 4.0 ile gelen IObserverve IObservableaçıklamaya çalıştım, umarım biraz olsun faydası olur.</p>
<p>Örnek projeyi <a href="https://skydrive.live.com/?cid=f66549bc9e13f731&amp;sc=documents&amp;id=F66549BC9E13F731%21560#" target="_blank">buradan </a>indirebilirsiniz&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2011/10/iobserver-ve-iobservable-ile-biri-bizi-gozetliyor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft “Roslyn” CTP&#8217;si sonunda çıktı&#8230;</title>
		<link>http://www.minepla.net/2011/10/microsoft-roslyn-ctpsi-sonunda-cykty/</link>
		<comments>http://www.minepla.net/2011/10/microsoft-roslyn-ctpsi-sonunda-cykty/#comments</comments>
		<pubDate>Wed, 19 Oct 2011 19:55:27 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Roslyn]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=1667</guid>
		<description><![CDATA[Uzun süredir beklediğim Roslyn&#8217;nin CTP versiyonu bügun itibari ile çıkmış bulunmakta&#8230;Peki nedir bu Roslyn diyecek olursanız, kısaca açıklamaya çalışim. Hangi platform olursa olsun compiler&#8217;lar kara kutudur genellikle&#8230;İçerisinde neler oluyor, neler bitiyor uygulama geliştiriciler tarafından hiç bilinmez. Roslyn ile bu biraz değişiyor işte. Rosyln sayesinde compiler&#8217;ların çalışma şekillerini kontrol edebileceğiz. Roslyn&#8217;nin sunduğu API&#8217;ler ile belki kendi [...]]]></description>
			<content:encoded><![CDATA[<p>Uzun süredir beklediğim Roslyn&#8217;nin CTP versiyonu bügun itibari ile çıkmış bulunmakta&#8230;Peki nedir bu Roslyn diyecek olursanız, kısaca açıklamaya çalışim. Hangi platform olursa olsun compiler&#8217;lar kara kutudur genellikle&#8230;İçerisinde neler oluyor, neler bitiyor uygulama geliştiriciler tarafından hiç bilinmez. Roslyn ile bu biraz değişiyor işte. Rosyln sayesinde compiler&#8217;ların çalışma şekillerini kontrol edebileceğiz. Roslyn&#8217;nin sunduğu API&#8217;ler ile belki kendi managed programlama dilimizi bile yazabileceğiz. Kodu daha iyi analiz edebilecek yöntemler üretebileceğiz. Bütün bunların amacı aslında Microsoft&#8217;un &#8216;compiler as a service&#8217;(CaaS) yaklaşımından ortaya çıkıyor aslında&#8230;Önümüzdeki günlerde blog&#8217;u tekrardan canlandıracak konular ile Roslyn&#8217;e daha fazla değineceğim&#8230;</p>
<p>CTP versiyonu <strong><a href="http://www.microsoft.com/download/en/details.aspx?id=27746" target="_blank">bu adresten</a></strong> indirebilirsiniz&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2011/10/microsoft-roslyn-ctpsi-sonunda-cykty/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Visual Studio 2010 ve performans analizi&#8230;</title>
		<link>http://www.minepla.net/2011/03/visual-studio-2010-ve-performans-analizi/</link>
		<comments>http://www.minepla.net/2011/03/visual-studio-2010-ve-performans-analizi/#comments</comments>
		<pubDate>Tue, 22 Mar 2011 22:49:13 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=1609</guid>
		<description><![CDATA[Geliştirdiğimiz uygulamaların performanslarına genellikle, uygulamayı geliştirmeyi bitirdikten sonra dikkat ediyoruz ne yazık ki…Geliştirme bittikten sonra müşteri söylenene kadar çok fazla bazı şeylerin farkında olamıyoruz…Performans ile ilgili konuları bilmemekten çok, daha ziyade geliştirme alışkanlığı olduğunu düşünüyorum bunun…En azından kendi çevremde gözlemlediğim durum bu şekilde. Performans, yazılımın kalitesini etkileyecek bir etken olabiliyor bazen. Belki ilk geliştirme aşamasında [...]]]></description>
			<content:encoded><![CDATA[<p>Geliştirdiğimiz uygulamaların performanslarına genellikle, uygulamayı geliştirmeyi bitirdikten sonra dikkat ediyoruz ne yazık ki…Geliştirme bittikten sonra müşteri söylenene kadar çok fazla bazı şeylerin farkında olamıyoruz…Performans ile ilgili konuları bilmemekten çok, daha ziyade geliştirme alışkanlığı olduğunu düşünüyorum bunun…En azından kendi çevremde gözlemlediğim durum bu şekilde.</p>
<p>Performans, yazılımın kalitesini etkileyecek bir etken olabiliyor bazen. Belki ilk geliştirme aşamasında değil ama sonradan kalitesini direk belirleyen bir faktör olabiliyor. Bundan dolayı geliştirme aşamasında uygulamamızın performansını nasıl kontrol eder ve gözlemleriz bunu örneklendirmeye çalışacağım. Tabi ki bunu <strong>Visual Studio 2010</strong> ile yapıyor olacağız…</p>
<p>Öncelikle çok basit bir konsol uygulaması yapalım. Performansını gözlemleyeceğimiz uygula olarak bu uygulamayı düşünebiliriz.</p>
<pre class="brush: csharp; title: ; notranslate">
    public class DummyClass
    {

        public void DoSomething()
        {
            string s = &quot;&quot;;

            for (int i = 0; i &lt; 10000; i++)
            {
                s += &quot;Performance test:&quot; + i;
                s += &quot;\r\n&quot;;
            }
            Console.WriteLine(s);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            DummyClass dummy = new DummyClass();
            dummy.DoSomething();

            Console.ReadLine();

        }
    }
</pre>
<p style="text-align: left;">Fark etmiş olduğunuz üzere çok komplike bir yapı yok…10.000 kere çalışan bir döngü içerisinde bir string değişkenine değer atıyoruz&#8230;Şimdi bu yazdığımız kodun performansını gözlemleyelim. Bunun için Visual Studio&#8217;nun <strong>Analyze</strong> menüsünden <strong>Launch Performance Wizard… </strong>seçeneğini seçmemiz gerekte.<br />
<a href="http://www.minepla.net/wp-content/uploads/Performance_1.jpg"><img class="aligncenter size-full wp-image-1610" title="Performans Analizi" src="http://www.minepla.net/wp-content/uploads/Performance_1.jpg" alt="" width="490" height="414" /></a></p>
<p style="text-align: left;"><strong><span id="more-1609"></span></strong></p>
<p>Bu seçeneği seçtikten sonra çeşitli performans ölçümleri için seçenekler karşımıza çıkacaktır.</p>
<ul>
<li><strong>CPU Sampling:</strong> Uygulamanın işlemci üzerinde ne kadar yük oluşturduğunu ölçmek adına bu seçeneği kullanabiliriz.</li>
<li><strong>Instrumentation: </strong>Uygulamanın içerisinde ki metodlar kaç kere çağrılmış ve bir metodun işlemini ne kadar sürede yapmış gibi bilgileri gözlemlemek için bu seçeneği seçebiliriz.</li>
<li><strong>.NET Memory Allocation:</strong> Uygulamanın bellek kullanımı ile ilgili performansını gözlemlemek için seçeceğimiz seçenek de bu seçenek olmalı.</li>
<li><strong>Concurrency:</strong> Eğer multi-thread bir uygulamamız var ise thread&#8217;lar arasında ki ilişkileri bu seçenek ile gözlemleyebiliriz.</li>
</ul>
<p style="text-align: center;"><a href="http://www.minepla.net/wp-content/uploads/Performance2.jpg"><img class="aligncenter size-full wp-image-1611" title="Performans Analizi" src="http://www.minepla.net/wp-content/uploads/Performance2.jpg" alt="" width="589" height="386" /></a></p>
<p style="text-align: left;">Bu yazı için <strong>CPU Sampling</strong> seçeneğini seçip <strong>Next</strong> diyoruz&#8230;Daha sonra aşağıdaki gibi bir ekran ile performans analizi yapacağımız projeyi ya da uygulamayı seçmemiz gerekiyor. Açık projeler var ise onlar listede çıkıyor olacaktır.</p>
<p style="text-align: center;"><a href="http://www.minepla.net/wp-content/uploads/Performance_3.jpg"><img class="aligncenter size-full wp-image-1612" title="Performans Analizi" src="http://www.minepla.net/wp-content/uploads/Performance_3.jpg" alt="" width="537" height="393" /></a></p>
<p style="text-align: left;">Projemizi seçip yine <strong>Next</strong> diyoruz. Bir sonra ki ekranda artık performans analizini çalıştırmak için son adımı tamamlıyoruz,yani bu ekranları kapattıktan sonra analiz operasyonunu başlat seçeneğini seçiyoruz. Eğer analizi daha sonra çalıştırmak istersek bu seçeneği seçmeyip, direk <strong>Finish</strong> diyebiliriz.</p>
<p style="text-align: center;"><a href="http://www.minepla.net/wp-content/uploads/Performance_5.jpg"><img class="aligncenter size-full wp-image-1613" title="Performans Analizi" src="http://www.minepla.net/wp-content/uploads/Performance_5.jpg" alt="" width="533" height="393" /></a></p>
<p><strong>Finish</strong> dedikten sonra uygulamamız kendiliğinden çalışacaktır. Ve arka tarafta analiz işlemi de uygulamamız ile paralel çalışıyor olacaktır.</p>
<p style="text-align: center;"><a href="http://www.minepla.net/wp-content/uploads/Performance_4.jpg"><img class="aligncenter size-full wp-image-1614" title="Performans Analizi" src="http://www.minepla.net/wp-content/uploads/Performance_4.jpg" alt="" width="486" height="307" /></a></p>
<p style="text-align: left;">Uygulamamızı kapattıktan sonra performans analizide tamamlanmış olacaktır. Tabi ki kapatmadan önce uygulamamızda ne yapmak istiyorsak, o operasyonları yapmamız daha mantıklı veriler içeren bir analiz raporu oluşmasını sağlar. Aşağıdaki gibi bir rapor analiz sonunca karşımıza çıkacaktır.</p>
<p style="text-align: center;"><a href="http://www.minepla.net/wp-content/uploads/Performance_6.jpg"><img class="aligncenter size-full wp-image-1615" title="Performans Analizi" src="http://www.minepla.net/wp-content/uploads/Performance_6.jpg" alt="" width="653" height="364" /></a></p>
<p style="text-align: center;">&nbsp;</p>
<p style="text-align: left;">Bu rapor ile uygulamızda performans adına ne gibi iyileştirmeler yapabiliriz bunları tespit etmek mümkün. Raporda ilgili metodlara tıklarsak bu metodların içerisinde, kodun hangi satırında, hangi metod kaynak kullanmış bu bilgiye de ulaşabiliyoruz.</p>
<p style="text-align: center;">&nbsp;</p>
<p style="text-align: center;"><a href="http://www.minepla.net/wp-content/uploads/Performance_7.jpg"><img class="aligncenter size-full wp-image-1616" title="Performans Analizi" src="http://www.minepla.net/wp-content/uploads/Performance_7.jpg" alt="" width="663" height="478" /></a></p>
<p style="text-align: left;">Basit bir örnek oldu gerçi ama umarım bir uygulamanın performansını Visual Studio ile nasıl gözlemleyebiliriz sorusuna biraz olsun cevap vermiştir. Ama daha bitmedi&#8230;(:</p>
<p style="text-align: left;">Bu basit performans analizinden sonra, sorunu görebilmiş olduk. Bildiğiniz üzere string tipindeki değişkenlere bu şekilde bir döngü içerisinde değer atamak hem bellek hemde işlemci açısından oldukça maliyetlidir. Şimdi isterseniz bunu düzeltip raporumuza tekrar göz atalım. Ama bunun için öncelikle bu raporu kaydetmemiz lazım. Daha sonra aşağıda ki gibi kodumuzu değiştirdikten sonra raporumuzu tekrar çalıştırıyoruz aynı şekilde&#8230;</p>
<p style="text-align: left;">&nbsp;</p>
<pre class="brush: csharp; title: ; notranslate">
    public class DummyClass
    {

        public void DoSomething()
        {
            //string s = &quot;&quot;;
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i &lt; 10000; i++)
            {
                //s += &quot;Performance test:&quot; + i;
                //s += &quot;\r\n&quot;;
                sb.Append(&quot;Performance test:&quot; + i);
                sb.Append(&quot;\r\n&quot;);
            }
            //Console.WriteLine(s);
            Console.WriteLine(sb.ToString());
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            DummyClass dummy = new DummyClass();
            dummy.DoSomething();

            Console.ReadLine();

        }
    }
</pre>
<p>Yukarıdaki düzeltmeden sonra raporumuz aşağıdaki gibi olacaktır. Dikkat edersiniz ki işlemci açısından ilk rapordaki gibi bir durum söz konusu değil. string değişkeni yerine StringBuilder sınıfını kullanarak işlemci yükünü azaltmış olduk. Burada Console.WriteLine() metodunda %100 gibi bir değerin olması sizi şaşırtmasın. Normal bir değer bu. Uygulama işlemci açısından konsola yazdırmak için kullanmış tüm gücünü. Bu da aslında gayet normal&#8230;Bu noktada bu raporlarda toplam değerin mutlaka %100 olacağını belirtmekte fayda var.</p>
<p style="text-align: center;"><a href="http://www.minepla.net/wp-content/uploads/Performance_8.jpg"><img class="aligncenter size-full wp-image-1620" title="Performance_8" src="http://www.minepla.net/wp-content/uploads/Performance_8.jpg" alt="" width="614" height="337" /></a></p>
<p>Bir önceki rapor ile bu son raporu bir biri ile karşılaştırmakta mümkün. Rapor ekranından Compare Reports&#8230; seçeneği ile bir önceki raporu seçtiğinizde iki rapor arasında ki gelişmeyi görebilirsiniz.</p>
<p>Bu tarz performans kontrollerini uygulama geliştirme aşamasında sık sık yapmakta fayda olacağına inanmaktayım. Bu şekilde uygulama tamamlanmadan önce performans sorunlarını tespit etmek çok daha kolay olacaktır.</p>
<p>Şimdilik bu kadar, bir sonra ki yazıda görüşmek üzere&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2011/03/visual-studio-2010-ve-performans-analizi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>‘Aspect Oriented’ programlamaya başlıyoruz…Bölüm II</title>
		<link>http://www.minepla.net/2011/03/aspect-oriented-programlamaya-basliyoruz-bolum-2/</link>
		<comments>http://www.minepla.net/2011/03/aspect-oriented-programlamaya-basliyoruz-bolum-2/#comments</comments>
		<pubDate>Tue, 22 Mar 2011 00:32:00 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[AOP]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=1600</guid>
		<description><![CDATA[Hatırlayacak olursanız son bir kaç yazıdır AOP hakkında bir şeyler paylaşıyordum. İlk iki yazı teorik, son yazı ise biraz daha uygulamaya yönelik olmuştu. Bu yazıda ise, bir önceki yazıda başlamış olduğum örneği biraz daha geliştirip, AOP&#8217;ı daha iyi anlamaya çalışacağız. Ama isterseniz önceki yazıları bir hatırlayalım… ‘Aspect Oriented’ programlama mı…Nedir ki? Peki ama neden ‘Aspect [...]]]></description>
			<content:encoded><![CDATA[<p>Hatırlayacak olursanız son bir kaç yazıdır AOP hakkında bir şeyler paylaşıyordum. İlk iki yazı teorik, son yazı ise biraz daha uygulamaya yönelik olmuştu. Bu yazıda ise, bir önceki yazıda başlamış olduğum örneği biraz daha geliştirip, AOP&#8217;ı daha iyi anlamaya çalışacağız. Ama isterseniz önceki yazıları bir hatırlayalım…</p>
<ol>
<li><a href="http://www.minepla.net/2011/03/aspect-oriented-programlama-mi-nedir-ki/"><strong>‘Aspect Oriented’ programlama mı…Nedir ki?</strong></a></li>
<li><a href="http://www.minepla.net/2011/03/peki-ama-neden-aspect-oriented-programlama/" target="_blank"><strong>Peki ama neden ‘Aspect Oriented’ programlama…</strong></a></li>
<li><strong><a href="http://www.minepla.net/2011/03/aspect-oriented-programlamaya-basliyoruz-bolum-i/" target="_blank">‘Aspect Oriented’ programlamaya başlıyoruz…Bölüm I</a></strong></li>
</ol>
<p>Bu yazıda bir önceki kod alt yapısını üzerinden giderek, <strong>AOP</strong> kavramında ki Aspect&#8217;leri yaratıyor olacağız. Özellikle <strong>&#8220;Aspect&#8221;</strong> şeklinde belirtmek istiyorum ki, yarattığımız bazı örnek sınıfları bu şekilde düşünmeye çalışmak, konunun bütününü anlamak adına yardımcı olacaktır. Hatırlarsanız bir önceki yazıda <em>Person</em> diye bir sınıf oluşturmuştuk örnek olarak ve bu sınıfı bir tane konsol uygulamasında kullanarak methodlarını çağırmadan önce nasıl araya girebileceğimize değinmiştim. Yine aynı sınıf üzerinden, onu biraz daha geliştirerek gidiyor olacağız. Bunun için sınıfımızı aşağıdaki gibi yenilememiz yeterli olacaktır şimdilik. Yeni bir özellik ve metod dışında aslında fazla bir şey de yok.</p>
<pre class="brush: csharp; title: ; notranslate">
    [Controller]
    public class Person : ContextBoundObject
    {
        private int _age = 0;
        private string _name = &quot;&quot;;

        public string Name { get { return _name; } }

        public Person(string name) : base() { _name = name; }

        public int Age
        {

            get
            {
                return _age;
            }
            set
            {
                _age = value;
            }
        }

        public string DoSomething()
        {

            string logMessage = &quot;Person sınıfının DoSomething() methodu çalıştı&quot;;
            Console.WriteLine(logMessage);

            return &quot;&quot;;
        }
        public void DoAnotherThing(int parameter1, string parameter2)
        {
            Console.WriteLine(&quot;Person sınıfının DoAnotherThing() methodu çalıştı&quot;);
        }

    }
</pre>
<p><strong>AOP</strong>, yazılımda ki kesişen ilgileri ayırmak için kullanabileceğimiz bir yöntemdi demiştik. Bu ilgiler her yazılım ürününde bir şekilde olan <strong>Logging,Exception Handling</strong> gibi kavramlar olabileceği gibi, iş kuralları ve bu kuralların işletildiği methodlar da olabilir. Ama genellikle bir biri ile çakışan ilgiler <strong>Logging,Exception Handling, Security</strong> gibi kavramlar için daha karmaşık olur. Oluşan <em>Exception</em> için uygun kaydı tutmak, ya da bir metod çalıştığında bu metodun çalışmasına dair bazı bilgileri kayıt altına alabilmek bir çok kavramın iç içe girmesine sebep olur. Bu yazıda bu ilgilere biraz daha yer vererek, bu ilgileri AOP yaklaşımı ile nasıl ayırabileceğimizi anlamaya çalışacağız.  Örnek olabilecek bir kaç ilgiyi oluşturup, bunu Person sınıfımızda kullanacağız. Bu ilgileri .NET Framework&#8217;ünde bulunan <strong>Attribute</strong>&#8216;lar ile yaratıp, nesnelerimize,metodlarımıza ve nesnelerin özelliklerine bağlayacağız. Aşağıdaki gibi bir kaç nesne, örnek olması adına yeterli olacaktır diye düşünüyorum.</p>
<p><strong><span id="more-1600"></span></strong></p>
<pre class="brush: csharp; title: ; notranslate">
    //Aspect'lerimiz için ortak bir yapı oluşturuyoruz.
    //Bu örnek için oldukça basit bir yapı oluşturmak
    //şimdilik yeterli olacaktır.
    //Attribute sınıfından türeyen bir BaseAspect sınıfı
    //oluşturuyoruz.
    public abstract class BaseAspect : Attribute
    {
        //abstract anahtar kelimesi ile tanımladığımız bu metodu
        //BaseAspect sınıfından türeyen tüm sınıflar yaratmak durumunda.
        //Bu method bu Aspect'in yapmakla yükümlü olduğu metodu simule ediyor
        //olacak...
        public abstract void Process(ref IMethodCallMessage message);
    }

    //Uygulamamızda Log'lama gerektiren yerlerde kullanabileceğimiz bir
    //ilgiyi bu şekilde tanımlayabiliriz.Bu Log'lama için ne yapılması gerekiyorsa
    //kendi içinde yapıyor olacak. BaseAspect sınıfımızdan gelen Process methodunun
    // message parametresinden istediğimiz özellikleri ihtiyacımıza göre alabiliriz.
    //Eğer kendi Log'lama için kullandığımız arayüzler varsa onları message parametresinden
    //çekip kullanmak mümkün.Bu örnekte konsola kayıt mesajı yazdıracağız.
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Method)]
    public class Logger : BaseAspect
    {
        public Logger()
        {

        }

        public override void Process(ref IMethodCallMessage message)
        {
            StringBuilder sb = new StringBuilder();
            if (message.Args != null)
            {
                //Metoddan gelen parametreleri yazdırıyoruz.
                for (int i = 0; i &lt; message.Args.Length; i++)
                {
                    sb.Append(String.Format(&quot;{0}={1}\r\n\t\t\t\t&quot;,message.GetArgName(i),message.Args[i]));
                }
            }

            Console.WriteLine(&quot;##LOG## &quot;+DateTime.Now.ToString()+&quot; - &quot;+ message.MethodName + &quot; methodu çalışacak.\r\n\t\t\t\t&quot; + sb.ToString() );
        }
    }

    //CanDrive adındaki Aspect'imiz aslında bir iş kuralını temsil ediyor
    //Aldığı parametre ile bir yaş sınırı belirlediğimiz bu ilgimiz
    //beraber kullanıldığı parametrenin yaş özelliğini kontrol ediyor.
    //Bu örnekte önemli olan nokta message parametresinden bize lazım olan bir
    //nesneyi kullanabilmemiz. Bu noktada altını çizmek isteyeceğim bir nokta var.
    //CanDrive kuralı kavram olarak hangi nesneler ile ilgili olacaksa bunların çok iyi belirlenmesi
    //gerekmekte. Buna göre içerisinde ki iş kuralı ve metodları dikkatlice yazılmalı.
    //Bu örnekte CanDrive, Person sınıfını kullanıyor. Çünkü CanDrive'ın ilgisi Person ile...
    //İlk yazımda da dediğim gibi AOP'i ilgileri ayırmak ve ayrıca yönetmek içinde kullanabiliriz.
    [AttributeUsage( AttributeTargets.Parameter)]//Sadece parametrelerde kullanabiliriz bu ilgiyi...
    public class CanDrive : BaseAspect
    {
        private int _age;

        public CanDrive(int age)
        {
            _age = age;
        }

        public override void Process(ref IMethodCallMessage message)
        {
            Person p = (Person)message.GetArg(0);
            if (p.Age &lt; _age)                 throw new Exception(String.Format(&quot;{0} araba süremez.Yaşı küçük.{1}&quot;, p.Name, p.Age));         }     }     //Bu seferde belli yaş aralığını kontrol eden ilgimiz var.     //CanDrive'a kavram olarak benziyor. Ama uygulama konusunda farklılık var.     [AttributeUsage(AttributeTargets.Property | AttributeTargets.Method)]     public class AgeValidation : BaseAspect     {         private int _age;         public AgeValidation(int age)         {             _age = age;         }         public override void Process(ref IMethodCallMessage message)         {             int ageValue = -1;             if (message.Args != null &amp;&amp; message.Args[0] != null)                 ageValue = (int)message.Args[0];             if (ageValue &gt; _age)
            {
                throw new Exception(String.Format(&quot;Yaş en çok {0} olabilir.{1} geçerli bir yaş değil.&quot;, _age, ageValue));
            }

        }
    }
</pre>
<p>Bu yaratmış olduğumuz ilgileri bir önceki yazıda oluşturduğumuz alt yapının algılayabileceği şekilde bir kaç değişiklik yapmamız gerekecek. Bunun için aşağıdaki değişikliği Control sınıfımıza eklememiz yeterli olacaktır.</p>
<pre class="brush: csharp; title: ; notranslate">
    public class Control : IMessageSink
    {

        private IMessageSink _messageSink;

        //İçeriğe dahil olan nesneler üzerinde kontroller yapabileceğimiz
        //nesneyi yaratmak için kullanacağımız yapıcı metodu,
        //alıcısını alacak şekilde tanımlıyoruz.
        public Control(IMessageSink sink)
        {
            _messageSink = sink;
        }

        //SyncProcessMessage metodu gelen alıcı mesaj aldığı zaman
        //çalışan bir metod. Bu metod ile alıcıya mesaj geldiği zaman
        //çeşitli kontrollerin yapılmasını sağlayabiliriz.
        //Burada mesaj diye tanımladığım operasyon aslında içeriğe dahil olan
        //nesnenin bir metodunun çalışması ya da bir özelliğinin çağrılması.
        //Bu örnekte şimdilik konsola bir mesaj yazdırıyor olacağız.
        public IMessage SyncProcessMessage(IMessage msg)
        {
            if (msg is IMethodCallMessage)
            {
                IMethodCallMessage preCall = (msg as IMethodCallMessage);
                this.BeforeMessageCall(ref preCall);//BeforeMessageCall diye bir metod yaratıyoruz.

            }
            return _messageSink.SyncProcessMessage(msg);
        }

        //AsyncProcessMessage metodu da SyncProcessMessage metodu ile aynı.
        //Sadece asenkron çağırımlarda çalışan versiyonu
        public IMessageCtrl AsyncProcessMessage(IMessage msg,
           IMessageSink replySink)
        {
            Console.WriteLine(&quot;Heyyy, önce bir dur bakalım...&quot;);
            return _messageSink.AsyncProcessMessage(msg, replySink);
        }

        //BeforeMessageCall metodu ile nesne yaratmadan önce,metod çağırmadan önce
        //ya da bir özelliği çağırmadan önce yapacağımız işlemleri çağırıyoruz.
        //Burada BaseAspect diye Attribute'ten türetilen kendi nesne tipimizi kontrol ediyoruz.
        //Eğer gelen mesajın özellikleri bu BaseAspect tipindense onun Process methodunu çağırıyoruz.
        //Burada hem metod hem de metod'un parametreleri var ise ve parametrelerde de BaseAspect tipi
        //olabilir mi diye kontrol ediyoruz.
        //-----------------------------------------------
        //Burada sadece method ve parametrelerini kontrol ediyoruz. Burada ki yapıyı genişleterek
        // daha güzel bir içerik yapabiliriz.
        private void BeforeMessageCall(ref IMethodCallMessage msg)
        {
            //Methodun
            BaseAspect[] attributes = msg.MethodBase.GetCustomAttributes(typeof(BaseAspect), true) as BaseAspect[];
            foreach (BaseAspect item in attributes)
            {
                item.Process(ref msg);
            }

            //Metodun parametrelerini alıyoruz.
            ParameterInfo[] parameters = msg.MethodBase.GetParameters();
            foreach (ParameterInfo item in parameters)
            {
                //Parametre değerlerinde BaseAspect'ten türeyen bir Attribute var mı kontrol ediyoruz.
                //Var ise metod çağrılmadan önce sahip olduğu Attribute çağırılıyor.
                attributes = item.GetCustomAttributes(typeof(BaseAspect), true) as BaseAspect[];
                foreach (BaseAspect parameterAttribute in attributes)
                {
                    parameterAttribute.Process(ref msg);
                }
            }

        }
   }
</pre>
<p>Bütün bunları yaptıktan sonra elimizde ne var kısaca bir özetleyelim; metodlarımızı, nesnelerimizi ve nesnelerin özelliklerini çağırmadan araya girebileceğimiz bir alt yapı, bu alt yapı içerisinde çeşitli sınıfları çalıştırmamızı sağlayacak metodlar ve çeşitli sınıflarımız(ilgilerimiz ya da &#8220;Aspect&#8221;lerimiz)</p>
<p>Şimdi bu yarattığımız ilgileri <em>Person</em> sınıfında kullanalım. Bunun için aşağıdaki gibi eklentiler yapmamız gerekmekte. Bu eklentiler aslında bir  yazılım projesinde her kısımda ortak olarak kullanılabilecek ilgileri temsil ediyor. Log&#8217;lama gibi…Ya da belli bir değerleri kontrol eden validasyonlar gibi…Aşağıdaki örnek bu iki kavram için yeterli olur umarım.</p>
<pre class="brush: csharp; title: ; notranslate">
    [Controller]
    public class Person : ContextBoundObject
    {
        private int _age = 0;
        private string _name = &quot;&quot;;

        public string Name { get { return _name; } }

        public Person(string name) : base() { _name = name; }

        public int Age
        {

            get
            {
                return _age;
            }
            [Logger]//Age özelliğine değer ataması yapmadan önce yine kayıt tutuyoruz
            [AgeValidation(150)]//Atanacak değerin kontrolünü AgeValidation ile kontrol ediyoruz
            set                 //Bu noktada bir insanın 150 yaşından büyük olamayacağını düşünüyoruz.
            {
                _age = value;
            }
        }

        //DoSomething metodu çağrılmadan önce metod ile ilgili kayıt tutuyoruz...
        [Logger]
        public string DoSomething()
        {

            string logMessage = &quot;Person sınıfının DoSomething() methodu çalıştı&quot;;
            Console.WriteLine(logMessage);

            return &quot;&quot;;
        }

        //DoAnotherthing metodu çağrılmadan önce yine kayıt tutuyoruz.
        //Bu sefer metodun 2 tane parametresi olduğuna dikkat edelim.
        [Logger]
        public void DoAnotherThing(int parameter1, string parameter2)
        {
            Console.WriteLine(&quot;Person sınıfının DoAnotherThing() methodu çalıştı&quot;);
        }

    }
</pre>
<p>Aşağıdaki gibi basit bir konsol uygulaması ile <em>Person</em> sınıfımızı kullanabiliriz. Dikkat edersiniz ki herhangi ekstra bir ilgi yok.</p>
<pre class="brush: csharp; title: ; notranslate">
    class Program
    {
        static void Main(string[] args)
        {

            Person arda = new Person(&quot;Arda Çetinkaya&quot;);
            arda.Age = 16;
            arda.DoSomething();
            arda.DoAnotherThing(5, &quot;Test parametresi&quot;);

            Console.ReadLine();

        }
    }
</pre>
<p>Çalıştırdığımız zaman bu kodu, aşağıdaki gibi bir çıktı alıyor olacağız. Çıktıyı kontrol ettiğimizde metod çağrımlarından önce ilgilerin çalıştığını göreceğiz.</p>
<p style="text-align: center;"><a href="http://www.minepla.net/wp-content/uploads/AOP_1.jpg"><img class="size-full wp-image-1601 aligncenter" title="AOP" src="http://www.minepla.net/wp-content/uploads/AOP_1.jpg" alt="" width="754" height="234" /></a></p>
<p>Uygulamada küçük bir deşiklik yaparak, başka bir çıktıyı da görelim isterseniz. Bunun için aşağıdaki <em>Person</em> sınıfındaki <em>Age</em> özelliğine 200 yazdığımızda programın çıktısı aşağıdaki gibi olacaktır ve yarattığımız <em>AgeValidation</em> ilgisine takılıp Exception fırlatacaktır.</p>
<p style="text-align: center;"><a href="http://www.minepla.net/wp-content/uploads/AOP_2.jpg"><img class="size-full wp-image-1602 aligncenter" title="AOP" src="http://www.minepla.net/wp-content/uploads/AOP_2.jpg" alt="" width="692" height="345" /></a></p>
<p style="text-align: center;">&nbsp;</p>
<p>Bu yoğun kodlar içerisinde umarım çok kaybolmamışınızdır ve biraz da olsa bazı şeyleri anlamaya yardımcı olmuştur umarım bu yazı…Ama henüz bitmedi…(: Bir küçük örnek ile <strong>AOP</strong> biraz daha iyi anlayacağız. Hatırlarsanız önce ki yazılarda nesnelerin bulunduğu duruma göre farklı özellikler kazanabileceğini söylemiştim. Aşağıdaki örnekte buna örnek veriyor olacağım.</p>
<pre class="brush: csharp; title: ; notranslate">
    //Car adı altında arabayı simule eden bir nesnemiz var
    //Aldığı Person tipinde ki parametre ile Drive() metodu
    //sınıfın içeriğini oluşturuyor.
    [Controller]
    public class Car : ContextBoundObject
    {
        //Dikkat ederseniz CanDrive() Aspect'i ile parametrenin
        //bu metod için uygun olup olmadığını kontrol ediyoruz.
        //18 yaşını doldurmuş olmak şeklindeki bir iş kuralını
        //bu şekilde uygulayabiliriz.
        //Ama bildiğiniz üzere bu iş kuralı çeşitli ülkelerde
        //değişik bir şekilde çalışır.Bunun için de aşağıdaki
        //sınıfa göz atmakta fayda var...
        public virtual void Drive([CanDrive(18)]Person driver)
        {

            Console.WriteLine(&quot;Bas gaza...&quot;);
        }
    }

    //Car'dan türeyen yeni bir sınıfımız var. Amerikan arabasını
    //temsil eden bu sınıf türediği sınıfın Drive() metodunu eziyor.
    public class AmericanCar : Car
    {
        //Burada dikkat edecek olursanız CanDrive() Aspect'inin aldığı
        //değer 16...Malum ABD'de araba kullanabilme yaşı 16...
        public override void Drive([CanDrive(16)]Person driver)
        {

            Console.WriteLine(&quot;Amerika'da 16 yaşında araba kullanılabiliyor...Bas gaza...&quot;);
        }
    }
</pre>
<p>Yukarıdaki nesneleri canlandırabilecek şekilde konsol uygulamamızı günceliyor ve daha sonra çalıştırıyoruz&#8230;</p>
<pre class="brush: csharp; title: ; notranslate">
    class Program
    {
        static void Main(string[] args)
        {

            Person arda = new Person(&quot;Arda Çetinkaya&quot;);
            arda.Age = 17;
            arda.DoSomething();
            arda.DoAnotherThing(5, &quot;Test parametresi&quot;);

            AmericanCar cadillac = new AmericanCar();
            cadillac.Drive(arda);

            Car anadol = new Car();
            anadol.Drive(arda);

            Console.ReadLine();

        }
    }
</pre>
<p style="text-align: center;"><a href="http://www.minepla.net/wp-content/uploads/AOP_3.jpg"><img class="aligncenter size-full wp-image-1603" title="AOP" src="http://www.minepla.net/wp-content/uploads/AOP_3.jpg" alt="" width="726" height="286" /></a></p>
<p>Dikkat ederseniz anadol adındaki değişkenimizin <em>Drive()</em> metoduna kadar sorunsuz çalışacaktır. cadillac tipindeki değişkenin <em>Drive()</em> metoduna parametre olarak verdiğimiz nesnemiz, <em>Drive()</em> metodu için gerekli ön şartı sağladığından onda bir sorun olmadığının altını çizmek isterim. Bu örnekte nesnelerin bulundukları duruma göre sahip oldukları Aspect&#8217;lerin değişebileceğini gördük. 17 yaşındaki bir insan Türkiye&#8217;de araba kullanamazken, ABD&#8217;de araba kullanabilir. Ama insan özellikleri aynıdır (: Bu şekilde nesnelerin özelliklerinin değişebileceği sistemlerde AOP yaklaşımlarını kullanmak, sistem içerisinde ki karmaşıklığı minimuma indirecektir.</p>
<p>Neyse çok daha fazla saçmalamadan bitiriyorum. Umarım bazı şeyler biraz daha netleşmiştir. Biraz karmaşık bir konu ve aslında daha çok konuşacak şey var. Burada bahsetmiş olduğum kodların sadece bir örnek olduğu lütfen aklınızdan çıkarmayın. Geliştirin,hatta geliştirirken benle de paylaşırsanız sevinirim. Bir de .NET tarafında şu anda tam olarak bir AOP desteğinin olmadığı hatırlatmak isterim. Ama .NET&#8217;de AOP yaklaşımlarını uygulayabileceğiniz alt yapıyı biraz olsun yaratabileceğinizi unutmayın. Unity&#8217;i bu bağlamda kurcalamakta fayda olabilir. Tam olmasa da yaklaşımları AOP ile hemen hemen aynı&#8230;</p>
<p>Şimdilik bu kadar&#8230;Lütfen her türlü düşünce ve sorunuzu paylaşmaktan çekinmeyin&#8230;</p>
<p>&nbsp;</p>
<p>Edit: Bu yazıda geçen örnek kodları <strong><a href="http://cid-f66549bc9e13f731.office.live.com/self.aspx/Code/Program.cs" target="_blank">buradan</a></strong> indirebilirsiniz&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2011/03/aspect-oriented-programlamaya-basliyoruz-bolum-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bakmakta fayda var VOL. III</title>
		<link>http://www.minepla.net/2011/01/bakmakta-fayda-var-vol-iii/</link>
		<comments>http://www.minepla.net/2011/01/bakmakta-fayda-var-vol-iii/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 07:56:41 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[Windows Phone]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=1481</guid>
		<description><![CDATA[Bildiğiniz üzere, yazılım ile ilgili Türkçe kaynak bulmak bazen zor olabiliyor&#8230;Hele ki şu son zamanlarda sağlam kaynak üreten kişilerin azalması işi daha da zorlaştırıyor&#8230;Neyse bu konuya girmeden, &#8220;Bakmakta fayda var&#8221; serisinin 3.sü ile, cidden bakmanızda faydası olacağını düşündüğüm bir kaç yazıyı paylaşıyorum&#8230;Buyrun buradan yakın&#8230; Paralel Programlamada İstisna Yönetimi ASP.net Nitelik(Attribute) Bazlı Veri Doğrulama(Validation) WCF İstemcinizin [...]]]></description>
			<content:encoded><![CDATA[<p>Bildiğiniz üzere, yazılım ile ilgili Türkçe kaynak bulmak bazen zor olabiliyor&#8230;Hele ki şu son zamanlarda sağlam kaynak üreten kişilerin azalması işi daha da zorlaştırıyor&#8230;Neyse bu konuya girmeden, &#8220;Bakmakta fayda var&#8221; serisinin 3.sü ile, cidden bakmanızda faydası olacağını düşündüğüm bir kaç yazıyı paylaşıyorum&#8230;Buyrun buradan yakın&#8230;</p>
<ul>
<li><a href="http://www.buraksenyurt.com/post/Paralel-Programlamada-Istisna-Yonetimi.aspx" target="_blank"><strong>Paralel Programlamada İstisna Yönetimi</strong></a></li>
<li><a href="http://canangumrukcuoglu.wordpress.com/2010/12/27/asp-net-nitelikattribute-bazli-veri-dogrulamavalidation/" target="_blank"><strong>ASP.net Nitelik(Attribute) Bazlı Veri Doğrulama(Validation)</strong></a></li>
<li><a href="http://www.enterprisecoding.com/blog/post/wcf-istemcinizin-baglanti-degerlerini-degistirerek-performansini-arttirin" target="_blank"><strong>WCF İstemcinizin Bağlantı Değerlerini Değiştirerek Performansını Arttırın</strong></a></li>
<li><a href="http://gokhanmanduz.blogspot.com/search/label/Raw%20Notification" target="_blank"><strong>Windows Phone 7 Push Notification Types</strong></a></li>
<li><a href="http://www.buraksenyurt.com/post/jQuery-Icerisinden-Bir-WCF-Servisini-Kullanmak.aspx" target="_blank"><strong>jQuery İçerisinden Bir WCF Servisini Kullanmak</strong></a></li>
<li><a href="http://www.enterprisecoding.com/blog/post/csharp5-kolaylasan-asenkron-islemleri" target="_blank"><strong>C# 5, Async ile Kolaylaşan Asenkron İşlemleri</strong></a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2011/01/bakmakta-fayda-var-vol-iii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bakmakta fayda var VOL. II</title>
		<link>http://www.minepla.net/2010/11/bakmakta-fayda-var-vol-ii/</link>
		<comments>http://www.minepla.net/2010/11/bakmakta-fayda-var-vol-ii/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 09:05:23 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Developers]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=1465</guid>
		<description><![CDATA[Daha önce &#8220;Bakmakta fayda var&#8221; yazısı ile başlamaya niyet ettiğim link paylaşımlarının yenisi ile bu niyetimi biraz daha ciddileştirmiş oluyorum&#8230; .Net teknolojileri ile haşır neşir olanlara bir kaç güzel Türkçe kaynak&#8230;Mutlaka takip edin, okuyun derim&#8230; WPF ile Model View ViewModel yazı dizisi ASP.NET MVC 3 ve Razor View Engine WCF Öğreniyorum video dizisi (Yeni başladı [...]]]></description>
			<content:encoded><![CDATA[<p>Daha önce &#8220;<strong><a href="http://www.minepla.net/2010/05/bakmakta-fayda-var/" target="_blank">Bakmakta fayda var</a></strong>&#8221; yazısı ile başlamaya niyet ettiğim link paylaşımlarının yenisi ile bu niyetimi biraz daha ciddileştirmiş oluyorum&#8230; .Net teknolojileri ile haşır neşir olanlara bir kaç güzel Türkçe kaynak&#8230;Mutlaka takip edin, okuyun derim&#8230;</p>
<ul>
<li><strong><a href="http://www.berkesokhan.com/blog/PermaLink,guid,6e41539a-f5dd-400a-8f55-2e8164995c80.aspx" target="_blank">WPF ile Model View ViewModel yazı dizisi</a></strong></li>
<li><strong><a href="http://nedirtv.com/video/aspnet-mvc-3-ve-razor-view-engine" target="_blank">ASP.NET MVC 3 ve Razor View Engine</a></strong></li>
<li><strong><a href="http://nedirtv.com/video/wcf-ogreniyorum-01-wcf-servis-gelistirmek-ve-kullanmak" target="_blank">WCF Öğreniyorum video dizisi</a> </strong>(Yeni başladı takip edin derim)</li>
<li><strong><a href="http://nedirtv.com/video/aspnet-40---url-routing" target="_blank">ASP.NET 4.0-URL Routing</a></strong></li>
<li><strong><a href="http://www.enterprisecoding.com/blog/post/internet-explorer-9%E2%80%93sabitlenmis-siteler" target="_blank">Internet Explorer 9–Sabitlenmiş Siteler</a></strong></li>
<li><a href="http://www.maxiasp.net/post/2010/09/26/Visual-Studio-2010-Architecture-Tools-I.aspx" target="_blank"><strong>Visual Studio 2010 Mimari Araçlar yazı dizisi</strong></a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2010/11/bakmakta-fayda-var-vol-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asp.Net MVC Framework&#8217;de MEF ile Controller eklentileri&#8230;</title>
		<link>http://www.minepla.net/2010/05/asp-net-mvc-frameworkde-mef-ile-controller-eklentileri/</link>
		<comments>http://www.minepla.net/2010/05/asp-net-mvc-frameworkde-mef-ile-controller-eklentileri/#comments</comments>
		<pubDate>Sat, 15 May 2010 15:32:37 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MEF]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=1202</guid>
		<description><![CDATA[Yine bir MEF yazısı&#8230;Bu sefer MEF&#8217;in kullanım alanlarını inceleyerek MEF&#8217;in gerçekten faydalı olabileceğini biraz daha net bir şekilde kavramaya çalışacağız. Bir önceki yazımda, Asp.Net MVC Framework&#8217;de &#8220;Controller&#8221; kavramını basitçe özetleyerek kendi çapımda anlatmaya çalışmıştım. Ne kadar faydalı oldu bilemeyeceğim ama bu sefer de, Asp.Net MVC Framework&#8217;de MEF&#8217;i nasıl uygulayabiliriz bunu anlatmaya çalışacağım. Başlıyoruz&#8230; Asp.Net MVC [...]]]></description>
			<content:encoded><![CDATA[<p>Yine bir MEF yazısı&#8230;Bu sefer MEF&#8217;in kullanım alanlarını inceleyerek MEF&#8217;in gerçekten faydalı olabileceğini biraz daha net bir şekilde kavramaya çalışacağız. Bir önceki yazımda, Asp.Net MVC Framework&#8217;de &#8220;Controller&#8221; kavramını basitçe özetleyerek kendi çapımda anlatmaya çalışmıştım. Ne kadar faydalı oldu bilemeyeceğim ama bu sefer de, Asp.Net MVC Framework&#8217;de MEF&#8217;i nasıl uygulayabiliriz bunu anlatmaya çalışacağım.</p>
<h2><strong>Başlıyoruz&#8230;</strong></h2>
<p>Asp.Net MVC uygulaması olarak, Visual Studio&#8217;da proje olarak gelen Asp.Net MVC projesini kullanıyor olacağız. Baştan bir MVC uygulaması yazmaya şimdi gerek yok, hazır yazılmışı olduğunu farz ederek bu proje şimdilik işimizi görecektir.</p>
<p>Aşağıdaki gibi bir proje yapımız olduğuna göre, tam olarak ne yapacağız buna geçelim. Amacımız MEF&#8217;in esnekliğini kullanarak Asp.Net MVC uygulamamızı esnetmek. Yani takıp çıkarabileceğimiz, bir birinden bağımsız bileşenler ile uygulamamıza genişletebilir bir yapı yapmak. Bu noktada takıp çıkarabileceğimiz bileşenler derken bunların <strong>&#8220;Controller&#8221;</strong>lar olduğunu belirtmekte fayda var sanırım.</p>
<p><strong>&#8220;Controller&#8221;</strong>ların takıp çıkarılması olayını biraz daha açıp,<strong> &#8220;Controller&#8221;</strong>ların ayrı *.dll&#8217;ler şeklinde Asp.Net MVC uygulamamıza entegre olabilen bileşenler demek sanırım daha açık olacaktır.</p>
<h2>Önce <strong>&#8220;Controller&#8221;</strong>ımızı yapalım&#8230;</h2>
<p>Takıp çıkarılabilen bir <strong>&#8220;Controller&#8221;</strong> için Visual Studio&#8217;da yeni bir &#8220;Class Library&#8221; projesi yapmamız gerekmekte. Bu projenin çıktısı bizim MVC uygulamamıza dışardan ekleyebileceğimiz <strong>&#8220;Controller&#8221;</strong>ımız olacak. Projemizin aşağıdaki gibi bir yapısı olması gerekmekte. (Not: Poll ismini bu örnekte anket yaptığımızı farz ederek koydum)</p>
<p style="text-align: center;"><a href="http://www.minepla.net/wp-content/uploads/mvcwithmef1.jpg"><img class="alignnone size-full wp-image-1203" title="mvcwithmef1" src="http://www.minepla.net/wp-content/uploads/mvcwithmef1.jpg" alt="" width="307" height="200" /></a></p>
<p style="text-align: left;">Index.asp&#8217;miz View tarafımız *.cs dosyamız ise<strong> &#8220;Controller&#8221;</strong>ımız olacak. Aşağıdaki kod örneği de şimdilik yeterli olacaktır.</p>
<pre class="brush: csharp; title: ; notranslate">
using System.Text;
using System.Web.Mvc;
using System.ComponentModel.Composition;
using Common;

namespace Plugins.Poll
{
    [Export(&quot;MVCController&quot;,typeof(IController))]
    [PluginMetadata(&quot;Poll&quot;, &quot;1.0&quot;, &quot;Arda&quot;)]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    public class Poll : Controller
    {
        public ActionResult Index()
        {
            return View(&quot;~/Plugins/Views/Poll/Index.aspx&quot;);
        }
    }

}
</pre>
<p><span id="more-1202"></span><br />
Export ve Metadata kavramlarını önceki yazılardan tanıyoruz zaten. Aslında çok da farklı bir şey yok, şu aşamaya kadar&#8230;Burda altını çizmek istediğim nokta, bu <strong>&#8220;Controller&#8221;</strong>ı IController tipinde bir arayüz ile &#8220;export&#8221; ediyor olmamız. Bu arayüz Asp.Net MVC Framework içerisinde bulunan bir yapı ve MVC Framework&#8217;ünde ki tüm <strong>&#8220;Controller&#8221;</strong>lar bu arayüzden türüyor. Dolayısıyla, Asp.Net MVC uygulamamızın bu geliştirdiğimiz<strong> &#8220;Controller&#8221;</strong>ı algılayabilmesi için bu arayüz tipiyle &#8220;export&#8221; etmemiz çok önemli.</p>
<p>Bu projenin için de, artık nasıl bir operasyon gerçekleştirmek istiyorsan onları yapmamız yeterli olacaktır.</p>
<h2><strong>Şimdi sıra Asp.Net MVC uygulamamızda&#8230;</strong></h2>
<p>Bunun için Asp.Net MVC uygulamamızda kendi geliştirdiğimiz bu yapıdaki <strong>&#8220;Controller&#8221;</strong>ları yükleyecek yapıyı oluşturmamız lazım. Bir önceki yazımda bahsettiğim <strong>Controller Factory</strong> yaklaşımını, gerçekleştiriyor olacağız ve kendi <strong>&#8220;Controller&#8221;</strong> fabrikamızı basitçe yazıyor olacağız.</p>
<p>Asp.Net MVC uygulamamızda da <strong>PluginControllerFactory</strong> sınıfını yaratmamız lazım. Bu kodu daha iyi anlayabilmek için MEF ile ilgili daha önceki yazılara bakmakta fayda var.</p>
<pre class="brush: csharp; title: ; notranslate">
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.ComponentModel.Composition.Primitives;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Common;

namespace MvcApplication2
{

    //IControllerFactory arayüzü MVC Framework'de Controller' yaratılmasında
    //gerekli olan bir arayüz. Geliştirilen tüm Controll fabrikalarının bu
    //arayüzden türemesi gerekiyor.
    public class PluginControllerFactory : IControllerFactory
    {
        private string _pluginPath;
        private DirectoryCatalog _catalog;
        private CompositionContainer _container;
        private DefaultControllerFactory _defaultControllerFactory;

        [ImportMany(&quot;MVCController&quot;, typeof(IController))]
        private IEnumerable&lt;Lazy&lt;IController, IPluginMetaData&gt;&gt; _plugins;

        public PluginControllerFactory(string pluginPath)
        {
            this._pluginPath = pluginPath;
            this._catalog = new DirectoryCatalog(_pluginPath);
            this._container = new CompositionContainer(_catalog);
            this._defaultControllerFactory = new DefaultControllerFactory();

        }
        //IControllerFactory arayüzünün iki tane metodu var.
        //Bunlardan biri CreateController metodu.
        //Bu metod gelen Routing talebini ve hangi
        //controller'ın yaratılması gerektiği bilgisi alıp,
        //&quot;Controller&quot;ın yaratılmasını sağlar. Dolayısıyla ne yapacaksak
        //bu metod içerisinde yapıyoruz. MVC uygulamamız için kendi
        //geliştirdiğimiz &quot;Controller&quot;ı bulup bu &quot;Controller&quot;ı MVC
        //uygulamıza gönderiyoruz.
        #region IControllerFactory Members
        public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
        {
            _container.ComposeParts(this);
            if (_plugins != null || _plugins.Count() != 0)
            {
                foreach (var item in _plugins)
                {
                    if (item.Metadata is IPluginMetaData)
                    {
                        IPluginMetaData metadata = item.Metadata as IPluginMetaData;
                        if (metadata.Name == controllerName)
                        {
                            IController controller = item.Value as IController;
                            return controller;
                        }
                    }

                }
            }

            return this._defaultControllerFactory.CreateController(requestContext, controllerName);
        }

        //Bu metod da IControllerFactory arayüzünden
        //gelen bir metod.Bu metod yaratılan &quot;Controller&quot;ların
        //yok edilmesini sağlıyor.
        public void ReleaseController(IController controller)
        {
            IDisposable disposable = controller as IDisposable;
            disposable.Dispose();
        }
        #endregion
    }
}
</pre>
<p>Şimdi tek yapmamız gereken Asp.Net MVC uygulamızın &#8220;Controller&#8221; yaratırken kendi &#8220;Controller&#8221; fabrikamızı kullanmasını söylemek. Bunun için global.asax dosyasında aşağıdaki gibi bir değişiklik yapmamız yeterli olacaktır.</p>
<pre class="brush: csharp; title: ; notranslate">
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RegisterRoutes(RouteTable.Routes);

            //Asp.Net MVC uygulamasının kendi yarattığımız &quot;Controller&quot;
            //fabrikasını kullanmasını ControllerBuilder sınıfının
            //Current özelliğinin SetControllerFactory metodu ile sağlıyoruz
            //&quot;Plugins&quot; parametresi ile de kendi yarattığımız &quot;Controller&quot;ların
            //hangi dizinde olacağını belirtiyoruz.
            ControllerBuilder.Current.SetControllerFactory(new PluginControllerFactory(
                Path.Combine(AppDomain.CurrentDomain.BaseDirectory, &quot;Plugins&quot;)));
        }
</pre>
<p>Artık Asp.Net MVC uygulamamız, kendi yarattığımız<strong> &#8220;Controller&#8221; </strong>fabrikası sayesinde, farklı <strong>&#8220;Controller&#8221;</strong>ların çok rahat bir şekilde sisteme dahil olmasını sağlıyor olacaktır.</p>
<p>Oldukça basit bir şekilde Asp.Net MVC Framework&#8217;de MEF&#8217;i nasıl uygulayabiliriz bunu anlatmaya çalıştım. Umarım biraz olsa da faydalı olmuştur.</p>
<p>Not: Yazıda geçen kodları ve projeyi <strong><a href="http://cid-f66549bc9e13f731.skydrive.live.com/self.aspx/Code/MvcApplication2.rar" target="_blank">buradan</a></strong> indirebilirsiniz.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2010/05/asp-net-mvc-frameworkde-mef-ile-controller-eklentileri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bakmakta fayda var&#8230;</title>
		<link>http://www.minepla.net/2010/05/bakmakta-fayda-var/</link>
		<comments>http://www.minepla.net/2010/05/bakmakta-fayda-var/#comments</comments>
		<pubDate>Thu, 06 May 2010 17:17:20 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Developers]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=1192</guid>
		<description><![CDATA[Her ne kadar yazılım ile uğraşan bizlerin az biraz ingilizcesi olsa da, bazen türkçe kaynak okuyor olmak, bazı şeyleri daha iyi anlamaya yardımcı olabiliyor. Ne yazık ki bu noktada da biraz kıtlık çekiyoruz&#8230;Bu kıtlık ortamında beğendiğim ve paylaşmak istediğim bazı yazıları paylaşmak istedim. Bir kuplesini aşağıda bulabilirsiniz. Boş zamanlarınızda mutlaka göz atmanınızı öneririm. Dinamik Oluşturulan [...]]]></description>
			<content:encoded><![CDATA[<div>Her ne kadar yazılım ile uğraşan bizlerin az biraz ingilizcesi olsa da, bazen türkçe kaynak okuyor olmak, bazı şeyleri daha iyi anlamaya yardımcı olabiliyor. Ne yazık ki bu noktada da biraz kıtlık çekiyoruz&#8230;Bu kıtlık ortamında beğendiğim ve paylaşmak istediğim bazı yazıları paylaşmak istedim. Bir kuplesini aşağıda bulabilirsiniz. Boş zamanlarınızda mutlaka göz atmanınızı öneririm.</div>
<p></p>
<div>
<ul>
<li><a href="http://www.enterprisecoding.com/blog/post/Dinamik-Olusturulan-Kodlara-Debug-Bilgisi-Eklemek.aspx" target="_blank"><strong>Dinamik Oluşturulan Kodlara Debug Bilgisi Eklemek</strong></a></li>
<li><a href="http://www.buraksenyurt.com/post/Workflow-Foundation-Ogreniyorum-Ders-1-Biraz-Daha-Bilesen.aspx" target="_blank"><strong>Workflow Foundation Öğreniyorum &#8211; Ders 1 &#8211; Biraz Daha Bileşen</strong></a><strong> (Bu seriyi takip edin derim)</strong></li>
<li><a href="http://daron.yondem.com/tr/PermaLink.aspx?guid=4d585208-997a-463e-beee-1aed4b2b4077" target="_blank"><strong>Silverlight 4&#8242;te desktop (Out-Of-Browser) uygulamalarının pencere tasarımını değiştirmek</strong></a></li>
<li><a href="http://www.turhaltemizer.com/2010/05/aspnet-mvc-microsoft-report-yardm-ile.html" target="_blank"><strong>Asp.Net MVC – Microsoft Report Yardımı ile Raporlama</strong></a></li>
<li><a href="http://www.umutluoglu.com/post/2009/11/25/cache-cesnesine-erisimde-kullanilabilecek-design-pattern-ler.aspx" target="_blank"><strong>Cache Nesnesine Erişimde Kullanılabilecek Design Pattern’ler</strong></a></li>
<li><a href="http://www.csharpnedir.com/articles/read/?id=1056&amp;title=XMLHttpRequest'in%20Genel%20Yap%C4%B1s%C4%B1" target="_blank"><strong>XMLHttpRequest&#8217;in Genel Yapısı</strong></a></li>
</ul>
</div>
<div>Zaman zaman bu tarz link paylaşımlarında bulunuyor olacağım. Tabi her zaman teknik konular içeren linkler de olmayacak (:</div>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2010/05/bakmakta-fayda-var/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

