{"id":8453,"date":"2010-10-28T16:29:26","date_gmt":"2010-10-28T14:29:26","guid":{"rendered":"https:\/\/fatihboy.com\/post\/tfs-api-olay-bildirimleri"},"modified":"2010-10-28T16:29:26","modified_gmt":"2010-10-28T14:29:26","slug":"tfs-api-olay-bildirimleri","status":"publish","type":"post","link":"https:\/\/fatihboy.com\/en\/tfs-api-olay-bildirimleri\/","title":{"rendered":"TFS Api, Olay Bildirimleri"},"content":{"rendered":"<p>&nbsp;&nbsp; \u00dcyesi oldu\u011fum ve kaynak kodlar\u0131n\u0131 <strong>Team Foundation Server<\/strong> \u00fczerinde tuttu\u011fumuz projelerde yap\u0131lan check-in\u2019leri takip ederek ekibi olas\u0131 yanl\u0131\u015fl\u0131klara kar\u015f\u0131 uyarmak sevdi\u011fim bir huyumdur. Benim gibi di\u011fer ekip \u00fcyelerinin de bu \u015fekilde hareket etmesi bir i\u00e7 kontrol mekanizmas\u0131 olu\u015fturarak daha kaliteli kod \u00e7\u0131kmas\u0131na da yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Bunun belkide tek dez avantaj\u0131, ekip \u00fcyelerinden birisi ayr\u0131ld\u0131\u011f\u0131nda ortaya \u00e7\u0131kmakta. Bu durumda ayr\u0131lan ekip \u00fcyesi olay bildirimlerini temizlememi\u015f ise, sistemde gereksiz yere at\u0131lan bir dolu mail olacak ve y\u00fcksek sirkalasyona sahip kurumlarda bu durumda b\u00fcy\u00fck problem olu\u015fturacakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Bu konuda s\u0131k\u0131nt\u0131 ya\u015fayanlar i\u00e7in a\u015fa\u011f\u0131da ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc g\u00f6rd\u00fc\u011f\u00fcn\u00fcz k\u00fc\u00e7\u00fck bir program yazd\u0131m, <strong>TFS Olay Bildirim Temizleme<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/10\/TFSOlayBildirimTemizleme.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/10\/TFSOlayBildirimTemizleme_thumb.png\" alt=\"TFS olay bildirim temizleme uygulamas\u0131\"\/><\/a><\/figure><\/div>\n\n\n\n<p>&nbsp;&nbsp; Uygulama, temelde olay bildirim \u00fcyeleri ile bu \u00fcyelerin izledikleri olaylar\u0131 bularak kullan\u0131c\u0131ya g\u00f6stermekte. Kullan\u0131c\u0131 isterse olay bildirim \u00fcyeliklerini se\u00e7erek \u201c<em>Se\u00e7ilenler i\u00e7in bildirimleri kald\u0131r<\/em>\u201d butonu&nbsp; yard\u0131m\u0131yla bildirimlerine son verebilmekte.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Bonus olarak; bildirim \u00fcyelerinin ge\u00e7erli kullan\u0131c\u0131lar olup olmad\u0131\u011f\u0131n\u0131 (<em>domain i\u00e7erisinde kay\u0131tl\u0131 olup olmad\u0131\u011f\u0131n\u0131<\/em>) kontrol ederek, ge\u00e7ersiz kullan\u0131c\u0131lar\u0131n ba\u015f\u0131na !- ekleyerek farkedilmelerini sa\u011fl\u0131yorum.<\/p>\n\n\n\n<p>&nbsp;&nbsp; \u0130sterseniz bu uygulamay\u0131 birlikte ad\u0131m ad\u0131m inceleyelim;<\/p>\n\n\n\n<p>&nbsp;&nbsp; \u0130\u015fe TFS sunucunuzu adresini \u00f6\u011frenerek a\u015fa\u011f\u0131daki ile ba\u011flanarak ba\u015flamal\u0131y\u0131z;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var uri = new Uri(\"http:\/\/TFS_SUNUCU_ADRESI\");\nsunucu = new TeamFoundationServer(uri.AbsoluteUri, new UICredentialsProvider());\nsunucu.EnsureAuthenticated();<\/pre>\n\n\n\n<p>&nbsp;&nbsp; \u0130lk sat\u0131r ile tfs sunucumuzun adresini belirtip ard\u0131ndanda bir sunucu nesnesi olu\u015fturuyoruz. Sunucuyu olu\u015ftururken verdi\u011fimiz ikinci parametre (<strong>UICredentialsProvider<\/strong>) bir domain\u2019e dahil olmayan sistemlerde kullan\u0131c\u0131 bilgilerinin aray\u00fcz \u00fczerinden sorulmas\u0131 amac\u0131yla verilmi\u015ftir. son sat\u0131rda \u00e7a\u011fr\u0131lar <strong>EnsureAuthenticated<\/strong> fonksiyonu ise bilgilerin do\u011frulanmas\u0131\/ hatal\u0131 bilgi verilmesi durumunda ise yeniden sorulmas\u0131n\u0131 sa\u011flayacakt\u0131r. Burada d\u00fc\u015fmem gereken bir not; sunucu nesnesi s\u0131n\u0131f i\u00e7erisinde tan\u0131mland\u0131\u011f\u0131 i\u00e7in yukar\u0131daki sat\u0131rlarda bir tan\u0131mlama yer almamaktad\u0131r, bu kodu do\u011frudan kullan\u0131rsan\u0131z \u00f6ncelikle bu tan\u0131mlamay\u0131 yapmal\u0131s\u0131n\u0131z. Aksi durumda hata mesaj\u0131 alacaks\u0131n\u0131zd\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Alternatif olarak a\u015fa\u011f\u0131daki \u015fekillerde de TFS sunucuna ba\u011flant\u0131 kurabilirsiniz;<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<ul class=\"wp-block-list\"><li> Bu \u00f6rnekte sisteme giri\u015f yapt\u0131\u011f\u0131n\u0131z kullan\u0131c\u0131 bilgileri kullan\u0131larak TFS yetkilendirilmesi yap\u0131lmakta; <\/li><\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var uri = new Uri(\"http:\/\/TFS_SUNUCU_ADRESI\");\nsunucu = TeamFoundationServerFactory.GetServer(uri.AbsoluteUri);\nsunucu.EnsureAuthenticated();<\/pre>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<ul class=\"wp-block-list\"><li>Bu \u00f6rnekte ise, TFS yetkilendirmesinde kullan\u0131lacak olan kullan\u0131c\u0131 bilgileri programsal olarak verilmekte;  <\/li><\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var networkCredential = new NetworkCredential(\"fatih\", \"\u015e\u0130FREN\u0130Z\", \"fatihboy.com\");\n \nvar uri = new Uri(\"http:\/\/TFS_SUNUCU_ADRESI\");\nsunucu = new TeamFoundationServer(uri.AbsoluteUri, networkCredential);\nsunucu.EnsureAuthenticated();<\/pre>\n<\/div><\/div>\n\n\n\n<p>&nbsp; TFS ba\u011flant\u0131s\u0131n\u0131 ba\u015far\u0131l\u0131 \u015fekilde sa\u011flad\u0131ktan sonra s\u0131ra da kay\u0131tl\u0131 olay bildirimlerini listelemede. Formun a\u00e7\u0131l\u0131\u015f\u0131nda kullan\u0131c\u0131y\u0131 bekletmemek ad\u0131na olay bildirim listesinin \u00e7ekilmesi i\u00e7in forma bir buton ekleyerek t\u0131klanmas\u0131 durumunda listemeyi uygun g\u00f6rd\u00fcm. TFS api\u2019siyle gelen <em>Olay Hizmeti<\/em> (<strong>IEventService<\/strong>, <em>Microsoft.TeamFoundation.Client.dll<\/em>) kay\u0131tl\u0131 bildirimleri listemek amac\u0131yla bizlere <strong>EventSubscriptions<\/strong> fonksiyonunu sunmaktad\u0131r. Parametre olarak sorgulanmak istenen kullan\u0131c\u0131n\u0131n id\u2019sini (SID) isteyen fonksiyon, \u201c*\u201d parametresi kullan\u0131l\u0131rsa bizlere t\u00fcm girdileri sunacakt\u0131r. TFS olay bildirim hizmetine ula\u015fmak ve EventSubscriptions fonksiyonunu \u00e7a\u011f\u0131rmak i\u00e7in gerekli kod par\u00e7ac\u0131\u011f\u0131n\u0131 a\u015fa\u011f\u0131da bulabilirsiniz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var olayHizmeti = sunucu.GetService&lt;IEventService>();\nvar uyelikler = olayHizmeti.EventSubscriptions(\"*\");<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Kod par\u00e7ac\u0131\u011f\u0131yla kay\u0131tl\u0131 t\u00fcm bildirim \u00fcyelikleri hizmet \u00fczerinden \u00e7ekilerek uyelikler de\u011fi\u015fkeninde saklanmaktad\u0131r. <strong>Subscription<\/strong> (<em>Microsoft.TeamFoundation.Framework.Client<\/em>) listesi olan bu de\u011fi\u015fkenin d\u00f6ng\u00fc i\u00e7erisinde d\u00f6n\u00fclmesiyle kay\u0131t her bir olay bildirim \u00fcyeli\u011fine ula\u015f\u0131labilir. <strong>Subscription<\/strong> s\u0131n\u0131f\u0131 i\u00e7erisinde olay t\u00fcr\u00fc, bildirim \u00fcyelik id\u2019si, ko\u015ful ve bildirimin iletilme \u015fekli gibi bilgiler yan\u0131nda, kaydeden kullan\u0131c\u0131n\u0131n <em>SID\u2019sinin tutuldu\u011fu<\/em> <strong>Subscriber<\/strong> \u00f6zelli\u011fine de sahiptir. A\u015fa\u011f\u0131daki kod par\u00e7ac\u0131\u011f\u0131yla kay\u0131tl\u0131 olay bildirimleri tek tek d\u00f6n\u00fclerek kaydeden kullan\u0131c\u0131n\u0131n SID\u2019si al\u0131nmaktad\u0131r;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">foreach (var uyelik in uyelikler) {\n   var kullaniciSID = uyelik.Subscriber;\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Peki geldi\u011fimiz noktada elimizde bulunan SID bilgisi ne i\u015fimize yarayacak? Elimizdeki SID\u2019yi kullan\u0131c\u0131ya g\u00f6stermek tek ba\u015f\u0131na bir \u015fey ifade etmeyecektir. Uygulamay\u0131 kullanacak olan kullan\u0131c\u0131lar SID\u2019ler yerine kullan\u0131c\u0131 isimlerini g\u00f6rmeyi isteyeceklerdir. \u015eansl\u0131y\u0131z ki TFS api\u2019siyle gelen <em>Grup G\u00fcvenlik Hizmetiyle<\/em> (<strong>IGroupSecurityService<\/strong>, <em>Microsoft.TeamFoundation.dll<\/em>) SID\u2019den kullan\u0131c\u0131 kimlik bilgilerine ula\u015fmam\u0131z\u0131 sa\u011flayacak olan <strong>ReadIdentity<\/strong> fonksiyonunu sunmakta. A\u015fa\u011f\u0131daki kod par\u00e7ac\u0131\u011f\u0131 ile bu servise ula\u015farak SID\u2019si \u00fczerinden sorgulama yap\u0131labilir;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var grupGuvenlikHizmeti = sunucu.GetService&lt;IGroupSecurityService>();\n \nvar kimlik = grupGuvenlikHizmeti.ReadIdentity(SearchFactor.Sid, kullaniciSID, QueryMembership.None);<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Bu noktada d\u00fc\u015f\u00fclmesi gereken \u00f6nemli bir not var; Olay Hizmetince iletilen \u00fcyelikler her zaman i\u00e7in kullan\u0131c\u0131 hesaplar\u0131 olmayabilir, hatta kimi zaman bu SID\u2019ler i\u00e7in sisteminizde bir kay\u0131t dahi bulamayailirsiniz (<em>kullan\u0131c\u0131 hesab\u0131n\u0131n sistemden silinmesi durumunda<\/em>). Bu sebeple a\u015fa\u011f\u0131daki kod par\u00e7ac\u0131\u011f\u0131nda da g\u00f6rebilece\u011finiz \u015fekilde \u00f6ncelikle gelen kimlik bilgisinin bo\u015f olmad\u0131\u011f\u0131n\u0131 ve bir Windows kullan\u0131c\u0131s\u0131 oldu\u011funu kontrol etmelisiniz.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">if (kimlik != null &amp;&amp; kimlik.Type == IdentityType.WindowsUser) {\n  \/\/kullan\u0131c\u0131y\u0131 aray\u00fczde g\u00f6stermeye y\u00f6nelik kodlar buraya eklenecek\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Y\u00f6netiminin daha kolay olmas\u0131 i\u00e7in tasar\u0131m\u0131mda a\u015fa\u011f\u0131daki \u015fekilde basit bir <strong>Kullan\u0131c\u0131<\/strong> s\u0131n\u0131f\u0131 olu\u015fturarak kullan\u0131c\u0131n\u0131n t\u00fcm kay\u0131tl\u0131 olay bildirimlerini bu nesne \u00f6rne\u011fi alt\u0131nda toplad\u0131m;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">internal sealed class Kullanici {\n    private List&lt;int> olayIdListesi;\n \n    public string Adi { get; private set; }\n    public int[] OlayIdListesi { get{ return olayIdListesi.ToArray();} }\n \n    public Kullanici(string adi) { \n        Adi = adi;\n        olayIdListesi = new List&lt;int>();\n    }\n \n    public void OlayEkle(int id) {\n        olayIdListesi.Add(id);\n    }\n \n    public override string ToString() {\n        return Adi;\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; A\u015fa\u011f\u0131daki kod par\u00e7ac\u0131\u011f\u0131nda Kullan\u0131c\u0131 s\u0131n\u0131f\u0131 ve bir s\u00f6zl\u00fck kullan\u0131larak olay bildirimlerinin bir araya nas\u0131l topland\u0131\u011f\u0131n\u0131 g\u00f6rebilirsiniz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">if (!olayKullanicilari.ContainsKey(kimlik.AccountName)) {\n    var kullanici = new Kullanici(kimlik.AccountName);\n    olayKullanicilari.Add(kimlik.AccountName, kullanici);\n \n    bildirimUyeListesi.Items.Add(kullanici);\n}\n \nolayKullanicilari[kimlik.AccountName].OlayEkle(uyelik.ID);<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Verilen SID i\u00e7in bir kimlik bilgisi bulunamamas\u0131 durumunda da kullan\u0131c\u0131lar bilgilendirilerek, gerekiyorsa olay bildiriminin kald\u0131r\u0131lmas\u0131 sa\u011flanabilir. A\u015fa\u011f\u0131daki kod bu ama\u00e7la kullan\u0131lmaktad\u0131r;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var anahtar = \"!-\" + uyelik.DeliveryPreference.Address;\n \nif (!olayKullanicilari.ContainsKey(anahtar)) {\n    var kullanici = new Kullanici(anahtar);\n    olayKullanicilari.Add(anahtar, kullanici);\n \n    bildirimUyeListesi.Items.Add(kullanici);\n}\n \nolayKullanicilari[anahtar].OlayEkle(uyelik.ID);<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Aray\u00fcz \u00fczerinden bildirimleri kald\u0131r\u0131lacak olan kullan\u0131c\u0131lar\u0131n se\u00e7ilmesi sonras\u0131 \u201c<em>Se\u00e7ilenler i\u00e7in bildirimleri kald\u0131r<\/em>\u201d butonuna bas\u0131lmas\u0131yla Olay Hizmeti i\u00e7erisinde yer alan <strong>UnsubscribeEvent<\/strong> fonksiyonu yard\u0131m\u0131yla se\u00e7ili kullan\u0131c\u0131ya ait t\u00fcm bildirim kay\u0131tlar\u0131 s\u0131rayla silinebilir. Bu i\u015fleme ait kod par\u00e7ac\u0131\u011f\u0131 ise \u015fu \u015fekilde olacakt\u0131r;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var seciliKullanicilar = bildirimUyeListesi.CheckedItems;\nvar eventService = sunucu.GetService&lt;IEventService>();\n \nforeach (Kullanici seciliKullanici in seciliKullanicilar) {\n    foreach (var olayId in seciliKullanici.OlayIdListesi) {\n        eventService.UnsubscribeEvent(olayId);\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Bu ad\u0131mlar sonras\u0131 kay\u0131t olay bildirimlerini listeyebilir, se\u00e7ili kullan\u0131c\u0131lar i\u00e7in olay bildirimlerini silebilirsiniz. A\u015fa\u011f\u0131da \u015fimdiye kadar sizlerle payla\u015fm\u0131\u015f oldu\u011fum kod par\u00e7ac\u0131klar\u0131n\u0131 b\u00fct\u00fcn olarak bulabilirsiniz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public partial class AnaEkran : Form {\n    private TeamFoundationServer sunucu;\n \n    public AnaEkran() {\n        InitializeComponent();\n \n        var uri = new Uri(\"http:\/\/TFS_SUNUCU_ADRESI\");\n \n        sunucu = new TeamFoundationServer(uri.AbsoluteUri, new UICredentialsProvider());\n \n        sunucu.EnsureAuthenticated();\n    }\n \n    private void listele_Click(object sender, EventArgs e) {\n        bildirimUyeListesi.Items.Clear();\n \n        var olayHizmeti = sunucu.GetService&lt;IEventService>();\n        var grupGuvenlikHizmeti = sunucu.GetService&lt;IGroupSecurityService>();\n \n        var uyelikler = olayHizmeti.EventSubscriptions(\"*\");\n        var olayKullanicilari = new Dictionary&lt;string, Kullanici>();\n \n \n        foreach (var uyelik in uyelikler) {\n            var kullaniciSID = uyelik.Subscriber;\n \n            var kimlik = grupGuvenlikHizmeti.ReadIdentity(SearchFactor.Sid, kullaniciSID, QueryMembership.None);\n \n            if (kimlik != null &amp;&amp; kimlik.Type == IdentityType.WindowsUser) {\n                if (!olayKullanicilari.ContainsKey(kimlik.AccountName)) {\n                    var kullanici = new Kullanici(kimlik.AccountName);\n                    olayKullanicilari.Add(kimlik.AccountName, kullanici);\n \n                    bildirimUyeListesi.Items.Add(kullanici);\n                }\n \n                olayKullanicilari[kimlik.AccountName].OlayEkle(uyelik.ID);\n            }\n            else if (kimlik == null) {\n                var anahtar = \"!-\" + uyelik.DeliveryPreference.Address;\n \n                if (!olayKullanicilari.ContainsKey(anahtar)) {\n                    var kullanici = new Kullanici(anahtar);\n                    olayKullanicilari.Add(anahtar, kullanici);\n \n                    bildirimUyeListesi.Items.Add(kullanici);\n                }\n \n                olayKullanicilari[anahtar].OlayEkle(uyelik.ID);\n            }\n        }\n \n \n    }\n \n    private void secilileriKaldir_Click(object sender, EventArgs e) {\n        var seciliKullanicilar = bildirimUyeListesi.CheckedItems;\n        var eventService = sunucu.GetService&lt;IEventService>();\n \n        foreach (Kullanici seciliKullanici in seciliKullanicilar) {\n            foreach (var olayId in seciliKullanici.OlayIdListesi) {\n                eventService.UnsubscribeEvent(olayId);\n            }\n        }\n    }\n}\n \ninternal sealed class Kullanici {\n    private List&lt;int> olayIdListesi;\n \n    public string Adi { get; private set; }\n    public int[] OlayIdListesi { get{ return olayIdListesi.ToArray();} }\n \n    public Kullanici(string adi) { \n        Adi = adi;\n        olayIdListesi = new List&lt;int>();\n    }\n \n    public void OlayEkle(int id) {\n        olayIdListesi.Add(id);\n    }\n \n    public override string ToString() {\n        return Adi;\n    }\n}<\/pre>","protected":false},"excerpt":{"rendered":"<p>&nbsp;&nbsp; \u00dcyesi oldu\u011fum ve kaynak kodlar\u0131n\u0131 Team Foundation Server \u00fczerinde tuttu\u011fumuz projelerde yap\u0131lan check-in\u2019leri takip ederek ekibi olas\u0131 yanl\u0131\u015fl\u0131klara kar\u015f\u0131 uyarmak sevdi\u011fim bir huyumdur. Benim gibi di\u011fer ekip \u00fcyelerinin de bu \u015fekilde hareket etmesi bir i\u00e7 kontrol mekanizmas\u0131 olu\u015fturarak daha kaliteli kod \u00e7\u0131kmas\u0131na da yard\u0131mc\u0131 olacakt\u0131r. &nbsp;&nbsp; Bunun belkide tek dez avantaj\u0131, ekip \u00fcyelerinden birisi&#8230;<\/p>\n<p><a class=\"read-more\" href=\"https:\/\/fatihboy.com\/en\/tfs-api-olay-bildirimleri\/\">Read More<\/a><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[71,28],"tags":[59],"class_list":["post-8453","post","type-post","status-publish","format-standard","hentry","category-team-foundation-server","category-turkce","tag-team-foundation-server"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>TFS Api, Olay Bildirimleri - Fatih Boy<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihboy.com\/en\/tfs-api-olay-bildirimleri\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TFS Api, Olay Bildirimleri - Fatih Boy\" \/>\n<meta property=\"og:description\" content=\"&nbsp;&nbsp; \u00dcyesi oldu\u011fum ve kaynak kodlar\u0131n\u0131 Team Foundation Server \u00fczerinde tuttu\u011fumuz projelerde yap\u0131lan check-in\u2019leri takip ederek ekibi olas\u0131 yanl\u0131\u015fl\u0131klara kar\u015f\u0131 uyarmak sevdi\u011fim bir huyumdur. Benim gibi di\u011fer ekip \u00fcyelerinin de bu \u015fekilde hareket etmesi bir i\u00e7 kontrol mekanizmas\u0131 olu\u015fturarak daha kaliteli kod \u00e7\u0131kmas\u0131na da yard\u0131mc\u0131 olacakt\u0131r. &nbsp;&nbsp; Bunun belkide tek dez avantaj\u0131, ekip \u00fcyelerinden birisi...Read More\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihboy.com\/en\/tfs-api-olay-bildirimleri\/\" \/>\n<meta property=\"og:site_name\" content=\"Fatih Boy\" \/>\n<meta property=\"article:published_time\" content=\"2010-10-28T14:29:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/10\/TFSOlayBildirimTemizleme_thumb.png\" \/>\n<meta name=\"author\" content=\"Fatih Boy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Boy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/\"},\"author\":{\"name\":\"Fatih Boy\",\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"headline\":\"TFS Api, Olay Bildirimleri\",\"datePublished\":\"2010-10-28T14:29:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/\"},\"wordCount\":1024,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"image\":{\"@id\":\"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/10\/TFSOlayBildirimTemizleme_thumb.png\",\"keywords\":[\"Team Foundation Server\"],\"articleSection\":[\"Team Foundation Server\",\"T\u00fcrk\u00e7e\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/\",\"url\":\"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/\",\"name\":\"TFS Api, Olay Bildirimleri - Fatih Boy\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/10\/TFSOlayBildirimTemizleme_thumb.png\",\"datePublished\":\"2010-10-28T14:29:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/#primaryimage\",\"url\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/10\/TFSOlayBildirimTemizleme_thumb.png\",\"contentUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/10\/TFSOlayBildirimTemizleme_thumb.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fatihboy.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TFS Api, Olay Bildirimleri\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihboy.com\/#website\",\"url\":\"https:\/\/fatihboy.com\/\",\"name\":\"Fatih Boy\",\"description\":\"Ki\u015fisel Web Sitesi\",\"publisher\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihboy.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\",\"name\":\"Fatih Boy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g\",\"caption\":\"Fatih Boy\"},\"logo\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/fatihboy.com\"],\"url\":\"https:\/\/fatihboy.com\/en\/author\/fatih\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"TFS Api, Olay Bildirimleri - Fatih Boy","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihboy.com\/en\/tfs-api-olay-bildirimleri\/","og_locale":"en_US","og_type":"article","og_title":"TFS Api, Olay Bildirimleri - Fatih Boy","og_description":"&nbsp;&nbsp; \u00dcyesi oldu\u011fum ve kaynak kodlar\u0131n\u0131 Team Foundation Server \u00fczerinde tuttu\u011fumuz projelerde yap\u0131lan check-in\u2019leri takip ederek ekibi olas\u0131 yanl\u0131\u015fl\u0131klara kar\u015f\u0131 uyarmak sevdi\u011fim bir huyumdur. Benim gibi di\u011fer ekip \u00fcyelerinin de bu \u015fekilde hareket etmesi bir i\u00e7 kontrol mekanizmas\u0131 olu\u015fturarak daha kaliteli kod \u00e7\u0131kmas\u0131na da yard\u0131mc\u0131 olacakt\u0131r. &nbsp;&nbsp; Bunun belkide tek dez avantaj\u0131, ekip \u00fcyelerinden birisi...Read More","og_url":"https:\/\/fatihboy.com\/en\/tfs-api-olay-bildirimleri\/","og_site_name":"Fatih Boy","article_published_time":"2010-10-28T14:29:26+00:00","og_image":[{"url":"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/10\/TFSOlayBildirimTemizleme_thumb.png","type":"","width":"","height":""}],"author":"Fatih Boy","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Fatih Boy","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/#article","isPartOf":{"@id":"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/"},"author":{"name":"Fatih Boy","@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"headline":"TFS Api, Olay Bildirimleri","datePublished":"2010-10-28T14:29:26+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/"},"wordCount":1024,"commentCount":1,"publisher":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"image":{"@id":"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/#primaryimage"},"thumbnailUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/10\/TFSOlayBildirimTemizleme_thumb.png","keywords":["Team Foundation Server"],"articleSection":["Team Foundation Server","T\u00fcrk\u00e7e"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/","url":"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/","name":"TFS Api, Olay Bildirimleri - Fatih Boy","isPartOf":{"@id":"https:\/\/fatihboy.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/#primaryimage"},"image":{"@id":"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/#primaryimage"},"thumbnailUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/10\/TFSOlayBildirimTemizleme_thumb.png","datePublished":"2010-10-28T14:29:26+00:00","breadcrumb":{"@id":"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/#primaryimage","url":"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/10\/TFSOlayBildirimTemizleme_thumb.png","contentUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/10\/TFSOlayBildirimTemizleme_thumb.png"},{"@type":"BreadcrumbList","@id":"https:\/\/fatihboy.com\/tfs-api-olay-bildirimleri\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fatihboy.com\/"},{"@type":"ListItem","position":2,"name":"TFS Api, Olay Bildirimleri"}]},{"@type":"WebSite","@id":"https:\/\/fatihboy.com\/#website","url":"https:\/\/fatihboy.com\/","name":"Fatih Boy","description":"Ki\u015fisel Web Sitesi","publisher":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihboy.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158","name":"Fatih Boy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fatihboy.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g","caption":"Fatih Boy"},"logo":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/fatihboy.com"],"url":"https:\/\/fatihboy.com\/en\/author\/fatih\/"}]}},"brizy_media":[],"_links":{"self":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/8453","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/comments?post=8453"}],"version-history":[{"count":0,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/8453\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/media?parent=8453"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/categories?post=8453"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/tags?post=8453"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}