2011-03-01 22 views
8

Belirli bir iş akışı geçişi olduğunda TFS 2010'un biraz özel kod çalıştırmasını istiyorum. Mümkün mü?TFS İş Öğesi Geçişinde Özel Kod Yürütme

otomatik olarak iş öğesi geçişlerini tetikleyebilen eylemler gibi görünen Özel İşlemler ile ilgili belgeleri buldum (bunu doğru alıyorum mı?) Ayrıca, Yapılarla ilgili Özel Etkinlikler buldum. Ama bu özel gereksinimi yerine getiren hiçbir şey - bir şey mi eksik?

Yardımlarınız için teşekkürler!

cevap

14

Bu çok yapılabilir.

Bunu yapmak için birçok yol var, bu yapılabilir. Benim favorilerimden biri sunucu tarafında eklenti yapmak. (Bu yalnızca 2010 TFS üzerinde çalışır, Not)

Bu blog yayınları temelini gösterebilirim:

benim açık kaynak değiştirilmiş bazı koddur proje TFS Aggregator:

public class WorkItemChangedEventHandler : ISubscriber 
{  
    /// <summary> 
    /// This is the one where all the magic starts. Main() so to speak. 
    /// </summary> 
    public EventNotificationStatus ProcessEvent(TeamFoundationRequestContext requestContext, NotificationType notificationType, object notificationEventArgs, 
               out int statusCode, out string statusMessage, out ExceptionPropertyCollection properties) 
    { 
     statusCode = 0; 
     properties = null; 
     statusMessage = String.Empty; 
     try 
     { 
      if (notificationType == NotificationType.Notification && notificationEventArgs is WorkItemChangedEvent) 
      { 
       // Change this object to be a type we can easily get into 
       WorkItemChangedEvent ev = notificationEventArgs as WorkItemChangedEvent; 
       // Connect to the setting file and load the location of the TFS server 
       string tfsUri = TFSAggregatorSettings.TFSUri; 
       // Connect to TFS so we are ready to get and send data. 
       Store store = new Store(tfsUri); 
       // Get the id of the work item that was just changed by the user. 
       int workItemId = ev.CoreFields.IntegerFields[0].NewValue; 
       // Download the work item so we can update it (if needed) 
       WorkItem eventWorkItem = store.Access.GetWorkItem(workItemId); 

       if ((string)(eventWorkItem.Fields["State"].Value) == "Done") 
        { 
         // If the estimated work was changed then revert it back. 
         // We are in done and don't want to allow changes like that. 
         foreach (IntegerField integerField in ev.ChangedFields.IntegerFields) 
         { 
          if (integerField.Name == "Estimated Work") 
          { 
           eventWorkItem.Open(); 
           eventWorkItem.Fields["Estimated Work"].Value = integerField.OldValue; 
           eventWorkItem.Save(); 
          } 
         } 
        } 
       } 
      } 

     } 
     return EventNotificationStatus.ActionPermitted; 
    } 

    public string Name 
    { 
     get { return "SomeName"; } 
    } 

    public SubscriberPriority Priority 
    { 
     get { return SubscriberPriority.Normal; } 
    } 

    public WorkItemChangedEventHandler() 
    { 
     //DON"T ADD ANYTHING HERE UNLESS YOU REALLY KNOW WHAT YOU ARE DOING. 
     //TFS DOES NOT LIKE CONSTRUCTORS HERE AND SEEMS TO FREEZE WHEN YOU TRY :(
    } 

    public Type[] SubscribedTypes() 
    { 
     return new Type[1] { typeof(WorkItemChangedEvent) }; 
    } 
} 

/// <summary> 
/// Singleton Used to access TFS Data. This keeps us from connecting each and every time we get an update. 
/// </summary> 
public class Store 
{ 
    private readonly string _tfsServerUrl; 
    public Store(string tfsServerUrl) 
    { 
     _tfsServerUrl = tfsServerUrl; 
    } 

    private TFSAccess _access; 
    public TFSAccess Access 
    { 
     get { return _access ?? (_access = new TFSAccess(_tfsServerUrl)); } 
    } 
} 

/// <summary> 
/// Don't use this class directly. Use the StoreSingleton. 
/// </summary> 
public class TFSAccess 
{ 
    private readonly WorkItemStore _store; 
    public TFSAccess(string tfsUri) 
    { 
     TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(new Uri(tfsUri)); 
     _store = (WorkItemStore)tfs.GetService(typeof(WorkItemStore)); 
    } 

    public WorkItem GetWorkItem(int workItemId) 
    { 
     return _store.GetWorkItem(workItemId); 
    } 
} 
+2

Dikkat edilmesi gereken önemli bir nokta, bu olayın bir bildirim olmasıdır (bir karar noktası değildir). Bu, onu engellemek için yapabileceğiniz hiçbir şey olmadığı anlamına gelir. Sadece buna tepki verebilirsin. – Vaccano

+0

Bu sadece aradığım şey. Çok teşekkürler. –

+0

@Vaccano - [TFS Toplayıcısı] (http://tfsaggregator.codeplex.com/) projesi ekibimiz için faydalı olmuştur. Sadece teşekkür etmek istedim ... Şimdi upvotes yaymak için şimdi codeplex üzerinde projenize kapalı! –

0

İşte benim tekil desen

public class TFSSingleton 
{ 
    private static TFSSingleton _tFSSingletonInstance; 
    private TfsTeamProjectCollection _teamProjectCollection; 
    private WorkItemStore _store; 

    public static TFSSingleton Instance 
    { 
     get 
     { 
      if (_tFSSingletonInstance == null) 
      { 
       _tFSSingletonInstance = new TFSSingleton(); 
      } 
      return _tFSSingletonInstance; 
     } 
    } 

    public TfsTeamProjectCollection TeamProjectCollection 
    { 
     get { return _teamProjectCollection; } 
    } 

    public WorkItemStore RefreshedStore 
    { 
     get 
     { 
      _store.RefreshCache(); 
      return _store; 
     } 
    } 

    public WorkItemStore Store 
    { 
     get { return _store; } 
    } 

    private TFSSingleton() 
    { 
     NetworkCredential networkCredential = new NetworkCredential("pivotalautomation", "*********", "***********"); 


     // Instantiate a reference to the TFS Project Collection 
     _teamProjectCollection = new TfsTeamProjectCollection(new Uri("http://********:8080/tfs/**********"), networkCredential); 
     _store = (WorkItemStore)_teamProjectCollection.GetService(typeof(WorkItemStore)); 
    } 
} 

bir örnektir ve burada Başvurulmadan nasıl.

WorkItemTypeCollection workItemTypes = TFSSingleton.Instance.Store.Projects[projectName].WorkItemTypes; 
İlgili konular