Как программно определить, требуется ли поле TFS WorkItem? - PullRequest
4 голосов
/ 22 ноября 2011

Мой проект требует от меня программного доступа к серверам TFS, которые мы не администрируем, и для получения информации в реальном времени о полях в WorkItemTypes. Я могу получить имена полей и большую часть необходимой мне информации, посмотрев на FieldDefinition в коллекции FieldDefinitions WorkItemType.

    public WitType(WorkItemType type)
    {
        this.Fields = new List<string>();

        foreach (FieldDefinition f in type.FieldDefinitions)
        {
            Fields.Add(f.Name);
        }
    }

Единственное, чего не хватает, это свойства IsRequired. Я должен быть в состоянии сказать, требуется ли поле. Я попытался выполнить запрос истории рабочего элемента

WorkItemCollection workItemCollection = workItemStore.Query
foreach (WorkItem workItem in workItemCollection)
foreach (Field field in workItem.Fields)
{
     textBox1.Text += field.Name + " is required? " +  field.IsRequired.ToString();                 
}

, а затем проверка свойства IsRequired элемента Field в коллекции полей WorkItem. Единственная проблема состоит в том, что для данного типа рабочего элемента один рабочий элемент говорит, что требуется заголовок, тогда следующий рабочий элемент будет иметь свойство IsRequired = false.

Есть ли способ определить, требуется ли поле WorkItem, не прибегая к файлу WIT xml? Если нет, есть ли способ получить программный доступ к XML-файлу WIT?

1 Ответ

1 голос
/ 30 ноября 2011

Мне нужно было выполнить аналогичную задачу, и следующий способ был единственным способом, которым я мог выяснить, как ее выполнить:

Как уже упоминалось, валидация WorkItem определяется в шаблоне WorkItemType.Поля могут иметь разные требования проверки, основанные на текущем состоянии WorkItem и даже разрешениях текущего пользователя.

Поэтому вам необходимо создать / получить экземпляр WorkItem с использованием учетных данных пользователя.Если ваше приложение олицетворяет текущего пользователя (то есть в приложении ASP.NET, использующем проверку подлинности и олицетворение Windows), вы можете просто использовать вариант 1, где вы используете API TFS для получения WorkItem, без олицетворения.* Если ваше приложение не выдает себя за пользователя, тогда вы можете использовать Вариант 2, где вы используете функцию олицетворения TFS, чтобы выполнять вызовы от имени пользователя.Это требует предоставления разрешения «Выполнять запросы на поведение других» в TFS для идентификации приложения (т. Е. В ASP.NET удостоверение пула приложений).Для получения дополнительной информации см. Следующую ссылку: http://blogs.microsoft.co.il/blogs/shair/archive/2010/08/23/tfs-api-part-29-tfs-impersonation.aspx

Следующий код является примером того, как выполнить Вариант 1 и Вариант 2.

        // Set the following variables accordingly
        string workItemTypeName = "Bug";
        string teamProjectName = "My Project";
        string usernameToImpersonate = "joesmith";
        string tfsTeamProjectCollectionUrl = "http://mydomain.com:8080/tfs/ProjectCollectionName";

        // OPTION 1: no impersonation.
        // Get an instance to TFS using the current thread's identity.
        // NOTE: The current thread's identity needs to have the "" permision or else you will receive
        //       a runtime SOAP exception: "Access Denied: [username] needs the following permission(s) to perform this action: Make requests on behalf of others"
        TfsTeamProjectCollection tfs = new TfsTeamProjectCollection( new Uri( tfsTeamProjectCollectionUrl ) );
        IIdentityManagementService identityManagementService = tfs.GetService<IIdentityManagementService>();

        // OPTION 2: impersonation.  Remove the following two lines of code if you don't need to impersonate.
        // Get an instance to TFS impersonating the specified user.
        // NOTE: This is not needed if the current thread's identity is that of the user 
        //       needed to impersonate. Simple use the ablve TfsTeamProjectCollection instance
        TeamFoundationIdentity identity = identityManagementService.ReadIdentity( IdentitySearchFactor.AccountName, usernameToImpersonate, MembershipQuery.None, ReadIdentityOptions.None );
        tfs = new TfsTeamProjectCollection( tfs.Uri, identity.Descriptor );

        WorkItem workItem = null;
        WorkItemStore store = tfs.GetService<WorkItemStore>();

        // Determine if we are creating a new WorkItem or loading an existing WorkItem.
        if( workItemId.HasValue ) {
           workItem = store.GetWorkItem( workItemId.Value );
        }
        else {
           Project project = store.Projects[ teamProjectName ];
           WorkItemType workItemType = project.WorkItemTypes[ workItemTypeName ];
           workItem = new WorkItem( workItemType );
        }

        if( workItem != null ) {

           foreach( Field field in workItem.Fields ) {
              if( field.IsRequired ) {
                 // TODO
              }
           }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...