2010-08-27 74 views
0

我正在嘗試用C#而不是設計器和XAML編寫一些活動。 VS2010一直有問題,而且速度很慢,而且它也有很差的編譯支持(對於變量名稱,屬性等)。用C編寫Workflow Foundation工作流程#

所以我試圖通過直接繼承Activity類來創建活動,但我遇到了一個障礙。

這裏是我的代碼:

public class TestActivity : Activity 
{ 
    public InArgument<string> Username { get; set; } 
    public InArgument<string> Password { get; set; } 
    public OutArgument<bool> ValidCredential { get; set; } 
    public OutArgument<ProvisioningRole> Role { get; set; } 
    public OutArgument<Guid> Guid { get; set; } 

    protected override Func<Activity> Implementation 
    { 
     get 
     { 
      return() => 
       { 
        return new Sequence() 
        { 
         Activities = 
         { 
          new AuthenticateUserActivity() 
          { 
           Username = this.Username, 
           Password = this.Password, 
           Guid = this.Guid, 
           Result = this.ValidCredential 
          }, 
          new If() 
          { 
           Condition = this.ValidCredential, 
           Then = new GetUserRoleActivity() 
           { 
            Username = this.Username, 
            Password = this.Password, 
            Result = this.Role 
           } 
          }, 
         } 
        }; 
       }; 
     } 
     set { base.Implementation = value; } 
    } 
} 

的問題是與IF()的條件。它應該是一個InArgument,但是this.ValidCredential是一個OutArgument。我試過創建一個變量,爲它賦值ValidCredential。我還嘗試將AuthenticateUserActivity的結果放入變量中,然後將其分配給ValidCredential,但出現錯誤,說明Assign的To屬性需要指定。

我已經四處尋找適當的教程,但我發現所有的MSDN文章有一個快速和髒的代碼實現,它使用文字而不是傳遞的參數,所以沒有從那裏的幫助。

回答

1

你應該能夠得到這個工作。基本方法應該是使用變量來存儲數據,使用OutArgument將活動中的數據從變量和InArguments中獲取,以便將變量中的數據導入到活動中。

另請注意,將InArguments與Variables綁定的表達式是VisualBasicValue表達式。因此,像:

條件=新VisualBasicValue( 「System.DateTime.Now.Hour < 12」)

This博客帖子是不是使用參數和變量,但顯示了幾個例子。

4

我發現如何去做。你只需要從原始的創建新的InArgument。有一個構造函數需要一個表達式。

Username = new InArgument<bool>((ActivityContext c) => this.ValidCredential.Get(c)) 

所以我改變了我的整個活動以

return new CompensableActivity() 
{ 
    Body = new Sequence() 
    { 
     Activities = 
      { 
       new AuthenticateUserActivity() 
       { 
        Username = this.Username.In(), 
        Password = this.Password.In(), 
        Guid = this.Guid.Out(), 
        Result = this.ValidCredential.Out() 
       }, 
       new If(this.ValidCredential.In()) 
       { 
        Then = new GetUserRoleActivity() 
        { 
         Username = this.Username.In(), 
         Password = this.Password.In(), 
         Result = this.Role.Out() 
        }, 
        Else = new Assign<ProvisioningRole>() 
        { 
         To = this.Role.Out(), 
         Value = ProvisioningRole.User 
        } 
       } 
      } 
    }, 
}; 

In和Out是擴展方法我說:

public static class WorkflowExtensions 
{ 
    #region In 
    public static InArgument<T> In<T>(this InArgument<T> self) 
    { 
     return new InArgument<T>(context => self.Get(context)); 
    } 

    public static InArgument<T> In<T>(this OutArgument<T> self) 
    { 
     return new InArgument<T>(context => self.Get(context)); 
    } 
    #endregion 

    #region Out 
    public static OutArgument<T> Out<T>(this InArgument<T> self) 
    { 
     return new OutArgument<T>(context => self.Get(context)); 
    } 

    public static OutArgument<T> Out<T>(this OutArgument<T> self) 
    { 
     return new OutArgument<T>(context => self.Get(context)); 
    } 
    #endregion 
} 

而現在一切都很好!

相關問題