• Anasayfa
  • Hakkımızda
  • Etkinlikler
  • Destek Verin
  • Site Haritası
  • Giriş Yap
  • Üye Ol
  • Facebook
  • Twitter
  • RSS
Yazılım Dilleri
  • Soru - Cevap
  • EĞİTİM SETİ
  • KATEGORİ
  • DUYURU
  • TEKNOLOJİ HABERLERİ

Son Sorular

  • 8/2/2020 11:38:31 PM'Basit' Yazılım Dili
  • 6/25/2020 3:18:13 PMderleme hatası
  • 12/11/2017 4:49:15 PMWindows Hizmeti Hk.
  • 4/23/2016 12:55:33 AMC programlama 2 oyun

Popüler Sorular

  • 5/27/2012 5:49:50 AMAsp.Net ile Date time alana veri ekleyemiiyorum ?
  • 4/2/2012 12:45:18 AM.exe uzantılı dosya için dijital imza nerde nasıl alınır.
  • 5/12/2012 8:44:49 AMAcil Yardım
  • 5/27/2012 1:46:51 PMveri tabanı bağlantısı
  • .Net Framework
  • 8085 Assembly
  • Active Directory
  • ADO.NET
  • Android
  • Apple IOS
  • Arduino
  • ASP.NET
  • ASP.NET MVC
  • Blackberry
  • C#.Net
  • C++
  • CCG Framework
  • CISCO
  • CSS
  • Diğer
  • Dreamweaver
  • Entity Framework
  • Exchange Server
  • Gömülü Sistemler
  • GSM Programlama
  • Güncel
  • Güvenlik
  • HTML5
  • Java
  • Javascript / JQuery
  • Jira
  • Kariyer ve İş Yaşamı
  • LibreOffice
  • LINQ
  • Linux
  • Matlab
  • Microsoft Dynamics CRM
  • Mobil Uygulama Geliştirme
  • MySQL
  • NoSQL
  • Oracle
  • OWIN
  • PFSense
  • PHP
  • Powershell
  • Python
  • Sanallastirma
  • SAP-ABAP
  • SCOM 2012
  • SEO
  • Sharepoint 2010
  • Sharepoint 2013
  • Silverlight
  • Sistem Analiz ve Tasarımı
  • SQL Server
  • Symantec
  • TFS
  • T-SQL
  • Ubuntu
  • VB.NET
  • Veritabanı Yönetim Sistemleri
  • Visual Studio
  • VMware
  • WCF
  • Web Hosting
  • Windows 8
  • Windows Azure
  • Windows Phone 7.1
  • Windows Phone 8
  • Windows Server
  • Wordpress
  • WPF
  • Xamarin
  • XNA
  • Yazılım Mühendisliği
  • Yöneylem Araştırması
  • ASP.NET MVC
  • Entity Framework
  • Javascript / JQuery
  • LINQ
  • PHP

Son Duyurular

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

TFS Client Object Model ile Word Entegrasyonu

Client Object Model den yararlanarak bir Word dokümanı içerisinden Team Foundation Server ortamına bağlanıp, öğe ekleme işleminin nasıl yapılabileceğini inceliyoruz.

12.04.2013

Yazar: Burak Selim Şenyurt (Google+)

Kategori: TFS

4289

Dodge-Challenger-production-1024x566Merhaba Arkadaslar,

Geçtigimiz gün National Geographic kanalinda Mega Fabrikalar’ i seyretme firsati buldum. Amerikali Dodge firmasi efsane Challanger‘ i yeniden üretmekteydi. Konu bu üretimin gerçeklestirildigi mega fabrikaydi.

Robotlarin, gelismis endüstürinin ve insan gücünün bir araya geldigi fabrika, sadece 24 saat içerisinde üretim hattindan mükemmel spor arabalar çikmaktaydi. Üstelik motor blogu da kitanin bir diger ucundan geliyordu.

Her ne kadar mükemmele yakin bir üretim bandi da olsa, akilli bilgisayarlar üretim sürecindeki her adimi gözlemliyor ve bir istisna olmasi halinde bandi durduruyordu. O da yetmiyor pek çok noktada usta insanlar devreye giriyor ve gerekirse üretim bandini kendi insiyatifleri ile durduruyorlardi. Tabi burada yazarak anlatmak çok zor o yüzden mutlaka seyredin derim. Aslinda belgeseli izlerken en çok da sunu düsündüm “Böyle muazzam yapilar nasil oluyor da insa ediliyor? Insan akli ne kadar muazzam ki her ayrintiyi düsünüyor, düsünmeye çalisiyor”

Derken bilgisayarimin basina döndüm ve kendi kendime söyle dedim “E illa ki bir Hello World uygulamalari vardir yahu” Nerd smile

Bu yazimiz ile birlikte Team Foundation Server maceralarimiza devam etmeye çalisiyor olacagiz. Yeni bölümüzde Client Object Model’ i bir Word uygulamasi içerisinde kullanmaya çalisacagiz ve çok basit olarak Work Item ögelerini nasil kayit edebilecegimizi görecegiz.

Team Foundation Server dünyasi ile iliskili önceki yazilarima asagidaki adreslerden ulasabilirsiniz.

  • TFS Client Object Model için Hello World
  • TFS Web Services ve Kullanimlari
  • Heryerden TFS Kullanabilmek

Çalismakta oldugumuz Team Project’ in süreç sablonu(Process Template) ne olursa olsun(Scrum, MSF, CMMI) giris yapilan ögeler Work Item olarak düsünülmektedir. Örnegin Scrum felsefesi göz önüne alindiginda Product Backlog Item, Task, Bug, Test Case ve Impediment birer Work Item’ dir. CMMI sablonuna bakildiginda ise Requirement, Task, Bug, Change Request, Issue, Review, Risk ve Test Case birer Work Item olarak düsünülmektedir.

Pek tabi bu Work Item ögeleri Client Object Model tarafinda da birer tip olarak ele alinabilirler. Client Object Model bilindigi üzere, Team Foundation Server in dis dünya ile olan iletisiminde ve özellikle çevre araçlar ile olan entegrasyonunda önemli bir yere sahiptir. Dilerseniz örnegimize geçelim ve adim adim ilerleyerek konuyu anlamaya çalisalim.

Senaryo

Elimizde Scrum 2.0 formatinda olusturulmus bir Team Project var. Amacimiz Word belgesi içerisinden, bir Product Backlog Item ve buna bagli iki Task ögesinin kayit edilmesini saglamak. Olayi son derece basit bir biçimde ele alacagimizdan Product Backlog Item ve Task ögeleri için sadece Title ve Description içeriklerin yer veriyor olacagiz. Kritik noktalardan birisi de, Task ögeleri ile Product Backlog Item arasinda Parent-Child iliskinin kurulmasidir. Yani Task ögeleri ilgili Product Backlog’ a bagli olacaklardir.

Ön Hazirliklar ve Doküman Tasarimi

Ise ilk olarak Visual Studio 2012 ortaminda bir Word 2010 Document projesi olusturarak baslamaliyiz.

tfsword_1

Bunun için yukaridaki ekran görüntüsünde oldugu gibi Office/Sharepoint sekmesinde yer alan Word 2010 Document sablonunun seçilmesi yeterlidir. Word uygulamasi içerisinde Team Foundation Server Client Object Model kullanilacagindan ilgili Assembly referanslarinin projeye eklenmesi de gerekmektedir. (Bu örnek için Microsoft.TeamFoundation.Client ve Microsoft.TeamFoundation.WorkItemTracking.Client dll’ lerini eklemeliyiz)

tfsword_3

Word dokümaninin tasarimini ise asagidaki ekran görüntüsünde yer aldigi gibi yapabiliriz.

tfsword_4

Oldukça sade bir tasarimimiz var. Örnegi mümkün oldugunca basit seviyede tutmamiz önemli. Product Backlog Item ile Task ögelerine ait Title ve Description girisleri için PlainTextContentControl bileseninden yararlanilmaktadir. Ve,

Kod

Kullanici Save islemini icra ettiginde(Ribbon kontrolüne basabilir, Ctrl+Save yapabilir vb), girdigi veri içeriginin TFS tarafindaki ilgili projenin backlog’ una yazilmasi gerekmektedir. Bu nedenle odak noktasi dokümanin BeforeSave olay metodudur. Lakin Client Object Model nesne referanslarinin nasil kullanildigina da dikkat edilmelidir.

using Microsoft.Office.Tools.Word;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
using System;

namespace HowTo_TFSandWord
{
    public partial class ThisDocument
    {
        #region Global degiskenler

        Uri tfsAddress = new Uri("http://tfsserver:8080/tfs/defaultcollection");
        TfsTeamProjectCollection collection = null;
        WorkItemStore store = null;
        Project argeProject = null;
        WorkItemType witBacklogItem = null;
        WorkItemType witTask = null;
        WorkItemLinkTypeEnd linkTypeEnd = null;

        #endregion Global degiskenler

        private void InitializeTFSComponents()
        {
            collection = new TfsTeamProjectCollection(tfsAddress);
            store = collection.GetService<WorkItemStore>();
            argeProject = store.Projects["ARGE"];
            witBacklogItem = argeProject.WorkItemTypes["Product Backlog Item"];
            witTask = argeProject.WorkItemTypes["Task"];
            linkTypeEnd = store.WorkItemLinkTypes.LinkTypeEnds["Parent"];
        }

        void ThisDocument_BeforeSave(object sender, SaveEventArgs e)
        {
            #region Yeni Bir Product Backlog Item Olusturmak

            int createdBacklogItemId=CreateBacklogItem(textBacklogTitle.Text, textBacklogDescription.Text);
            CreateTask(createdBacklogItemId, textTask1Title.Text, textTask1Description.Text);
            CreateTask(createdBacklogItemId, textTask2Title.Text, textTask2Description.Text);

            #endregion Yeni Bir Product Backlog Item Olusturmak
        }

        private int CreateBacklogItem(string title,string description)
        {
            WorkItem newBacklogItem = new WorkItem(witBacklogItem);
            newBacklogItem.Title = title;
            newBacklogItem.Description = description;
            newBacklogItem.Save();
            return newBacklogItem.Id;
        }

        private void CreateTask(int createdBacklogItemId,string title,string description)
        {  
            WorkItem newTask = new WorkItem(witTask);
            newTask.Title = title;
            newTask.Description = description;           
            newTask.WorkItemLinks.Add(new WorkItemLink(linkTypeEnd,  createdBacklogItemId));
            newTask.Save();
        }

        #region VSTO Designer generated code
       
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisDocument_Startup);
            this.Shutdown += new System.EventHandler(ThisDocument_Shutdown);
            this.BeforeSave += ThisDocument_BeforeSave;
            InitializeTFSComponents();
        }

        #endregion

        private void ThisDocument_Startup(object sender, System.EventArgs e)
        {

        }

        private void ThisDocument_Shutdown(object sender, System.EventArgs e)
        {
        }
    }
}

Öncelikli olarak TFS sunucusuna ve ilgili koleksiyona baglanilmasi gerekir. Bu amaçla TfsTeamProjectCollection sinifindan yararlanilmaktadir. Dikkat edilecegi üzere yapici metoda(Constructor) parametre olarak Default Collection için kullanilabilecek adres verilmistir. Work Item’ lar üzerinde CRUD islemlerini icra edebilmek için WorkItemStore servisine ulasilmasi gerekmektedir. Bu sebepten collection degiskeni üzerinden GetService fonksiyonuna basvurulmustur. Çok dogal olarak ARGE isimli örnek Team Project içerisine Work Item eklenmesi istenmektedir. Bu nedenle ilgili proje referansi, store degiskeni üzerinden Projects koleksiyonuna erisilerek elde edilmektedir. Gelelim Work Item olusturma kisimlarina.

Product Backlog Item için CreateBacklogItem, Task içinse CreateTask isimli metodlar kullanilmaktadir. Aslinda her ikisi de içerisinde bir WorkItem nesnesini örneklemekte ve ilgili özelliklerini set etmektedir. Ancak önemli bir fark vardir. Bir WorkItem nesne örnegi üretilirken, WorkItemType tipinden bir parametre verilir. Bu parametre, ilgili Work Item ögesinin ne olacagini belirtir. Bir Task mi, bir Product Backlog Item mi, bir Bug mi vs. Bundan sonraki kisimlarda yer alan özellikler temel anlamda ortak sayilabilir. Title ve Description özelliklerine ilgili degerler set edildikten sonra, WorkItem nesne örnegi üzerinden Save isleminin icra edilmesi yeterlidir.

WorkItem nesneleri kayit edildiginde Id özellikleri de, sunucu tarafindan verilen deger ile otomatik olarak doldurulur. Nitekim Parent-Child iliskinin olusturulmasi noktasinda, Parent Work Item’ in Id degerinin bilinmesi önemlidir. Bu sebepten CreateBacklogItem metodu geriyer üretilen Work Item Id degerini döndürmektedir. Bu deger CreateTask fonksiyonu için bir girdidir. CreateTask metodunun en kritik noktasi ise WorkItemLinks koleksiyonuna Parent tipte bir baglanti taniminin eklenmesidir. Bunun için WorkItemLinkTypeEnd ve WorkItemLink tiplerinden yararlanilmistir. Parametre olarak gelen integer deger bu senaryo da Parent olacak Product Backlog Item’ i isaret etmektedir.

Testler

Artik uygulamayi test edebiliriz. Örnek olarak ben asagidaki ekran görüntüsünde yer alan içerigi olusturdum.

tfsword_5

Åžu asamda Save islemini icra ettigimizde TFS tarafinda asagidaki içeriklerin olustuguna sahit olabiliriz. Dikkat edilecegi üzere “Müsteri karakteristigi olusturma” isimli bir Product Backlog Item olusturulmus ve varsayilan olarak o anki güncel Sprint’ e ilave edilmistir.

tfsword_6

Product Backlog Item açildiginda bir Id degeri aldigini ve Word dosyasinda belirttigimiz Description içerigine sahip oldugunu da görebiliriz.

tfsword_7

Hatta Tasks kismina geçtigimizde, Child olarak bagladigimiz Work Item ögelerini de görebiliriz. Dikkat edilecegi üzere 6539 ve 6540 numarali Task ögeleri Child olarak 6538 numarali Product Backlog’ a eklenmistir.

tfsword_8

Pek tabi ki bu Task örneklerine çift tiklandiginda, Word dosyasinda belirttigimiz Title ve Description bilgilerine sahip olduklarini görebiliriz.

tfsword_9

tfsword_10

Her sey çok kolay görünüyor degil mi? Ama pek çok eksik ve tamamlanmasi gereken is var. Bu islerin tamamlanmasi da önemli bir development eforunu gerektirmekte.

Eksikler

Bu nokta da örnegimizin aslinda sadece bir Hello World oldugunu ifade etmem gerekiyor. Sizin de fark edeceginiz gibi bazi eksik noktalar var. Örnegin,

  • Kullanici doküman içerigini doldurmadan da göndermeyi deneyebilir. Bu durumda bir tedbir almak faydali olacaktir. Hatta TFS’ in böyle bir durumda verecegi olasi Exception tepkisine karsi bir gelistirme yapilmalidir.
  • Akilli bir Save mekanizmasi gerekebilir. Ayni Title’ a sahip bir Work Item içeriginin olusturulmasinin önüne kolayca geçilebilir(WorkItem listesini çek, Title’ larini karsilastir) Ancak bire bir eslesmeyen fakat ayni anlama gelebilen Title’ lar var ise, belki kullaniciya bir pencere ile bildirimde bulunulup aralarinda seçim yapmasi istenebilir.
  • Örnekte sadece Title ve Description alanlari doldurulmustur. Oysaki bir Product Backlog Item veya Task için set edilmesi gereken daha pek çok özellik vardir. Söz gelimi kapasite planlamasi ve Velocity’ nin çikmasinda önem arz eden Product Backlog Item’ in Effort ve Business Value degerleri doldurulmamistir. Benzer sekilde Task’ lar için de bir atama islemi yapilmamistir. Yani ilgili Task kime atanmistir bilgisi eksiktir. (Bilindigi üzere Sprint planlama toplantilarinda bu tip ögeler son derece dikkatli bir sekilde tespit edilmekte ve doldurulmaktadir)
  • Ögeler varsayilan olarak kök Area altina atanmistir. Ancak farkli bir Area içerisinde tutulmasi da istenebilir. Dolayisiyla bu bilginin dosya daha açilmadan çekilmesi ve hatta dokümanda belki de bir ComboBox ile gösterilerek seçtirilmesi düsünülmelidir(Area’ ya benzer sekilde Sprint ve hatta Iteration seçimler de yaptirilabilir)
  • Örnekte sadece bir Product Backlog Item ve buna bagli iki Task girilmesi senaryosuna yer verilmistir. Oysa n adet giris yapilabilir. Dolayisiyla daha dinamik bir içerik giris alt yapisi hazirlanmalidir(Bu noktada Excel’ in TFS ile olan varsayilan entegrasyonuna bakmanizi öneririm)
  • Senaryomuzda ARGE isimli bir Team Project kullanilmaktadir. Pek ala Word dosyasi açilirken kullanicidan bir proje seçmesi istenebilir. Bu dogal olarak bir arabirimi gerektirmektedir(Hatta bu arabirimde hangi Team Project’ in hangi Sprint’ ine içerik girilecegi bilgisi dahi sorulabilir)

ve benzeri pek çok eksik bulunabilir. Ancak amacimiza ulastigimizi ve her zaman ki gibi kapiyi sadece araladigimizi, ardina kadar açmak için sizin çaba sarf etmeniz gerektigini hatirlatmak isterim. Böylece geldik bir yazimizin daha sonuna. Team Foundation Server ile iliskili arastirmalarima firsat buldukça devam ediyor olacagim. Tekrardan görüsünceye dek hepinize mutlu günler dilerim.

HowTo_TFSandWord.zip (208,21 kb)

Yazar Hakkında

Burak Selim Şenyurt

Burak Selim Şenyurt

buraksenyurt.com

Yıldız Teknik Üniversitesi Matematik Mühendisliği mezunu olan Şenyurt, 1999 yılında profesyonel olarak adım attığı yazılım dünyasında, 2003 yılından beri Microsoft .Net teknolojileri ile ilgilenmektedir. Yazılım hayatına Assist Line isimli Call Center firmasında Delphi programcısı olarak başlayan Şenyurt sonrasında, sırasıyla Bizitek(Junior Developer), Netron(Master Trainer), Citibank(Outsource Senior Software Developer), Innova(Application Development Consultant), ve TCM(Software Architect) firmalarında görev almıştır. Su anda ING Bank bünyesinde Kıdemli Yazılım Danışmanı olarak görev yapmaktadir. 2006, 2007 yıllarında C#, 2008,2009,2010 yıllarında ise Connected System Developer kategorisinde Microsoft MVP seçilen Şenyurt, evli ve 1 çocuk babasıdır. C# diline olan düşkünlüğü, oğluna S(h)arp adının verilmesinde önemli bir etken olmustur.

Sosyal Medya

ORANLAR

  • 4289izleme

Arkadaşlarınla Paylaş

  • Tweet

0 Yorum

Yorum Yaz / Soru Sor

Lütfen yorum yazmak veya soru sormak için üye girişi yapınız.

Son Yorumlar

  • Böyle bir sayfalama ağ trafiğini hafifleti...
  • Böyle bir sayfalama ağ trafiğini hafifleti...
  • Merhaba, ellerinize sağlık çok yardımcı ol...
  • Merhaba Bu uygulama örneğinden ASP.net ...
  • Hocam Link başka sayfaya yönlendiriyor.

En Güncel Sorular

  • Bilgilendirme maili (C#.Net)
  • Power Pivot (Sharepoint 2010)
  • BigInteger, BigDecimal (Asp.Net ve Asp.Net MVC)
  • visual C# ile asp nette veritabanı islemleri (Asp.Net ve Asp.Net MVC)
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ? (Sharepoint 2010)

En Son Cevap Verilen Sorular

  • Bilgilendirme maili
  • BigInteger, BigDecimal
  • visual C# ile asp nette veritabanı islemleri
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ?
  • txt dosyasına veri yazma

Twitter

Takip et: @yazilim_dilleri

En Çok Okunanlar

Elif BAYRAKDAR

C# ile SQL Server Bağlantısı, Insert, Update ve Delete Sorguları

23.05.2013

  • 123776
  • 0
Hakan Keskin

C# ile Windows Service Projesi Oluşturma, Debug Etme ve Setup Hazırlama

17.12.2013

  • 70839
  • 0
batuhan avlayan

Php - Mail Gönderme (İletişim Formu)

02.09.2013

  • 51496
  • 0

Sponsorlar

KODLAB
Pluralsight
Exchange server is
Office 365
YAZILIM DİLLERİ
Yukarı Çık
  • Hakkımızda
  • Facebook
  • Twitter
  • RSS

© Yazılım Dillerinin Buluşma Noktası | Kaynak belirtildiği sürece makaleler kopyalanabilir.
YazilimDilleri.Net sitesinde yer alan kullanıcıların oluşturduğu tüm içeriklerin yayınlanması ile ilgili yasal yükümlülükler içeriği oluşturan kullanıcıya aittir, YazilimDilleri.Net hiçbir şekilde sorumlu değildir.

Kapat

Giriş Yap

Kullanıcı Adı

Şifre

Şifremi Unuttum

KULLANICI GİRİŞİ