0

我想將約束設置爲活動以防止將其添加到某些其他活動。 我認爲GetParentChain存在問題。我做了一切像在MSDN樣本:爲什麼WF4約束不適用於Activity和CodeActivity父類型

我有三個活動:MyActivity,SqlNativeActivity和SqlActivity。這個班是這樣的:

SqlNativeActivity:

public sealed class SqlNativeActivity : BaseNativeActivity 
{ 
    public Activity Activity { get; set; } 

    protected override void Execute(NativeActivityContext context) 
    { 
    } 
} 

public abstract class BaseNativeActivity : NativeActivity 
{ 
    protected ActivityConstraintsProvider ActivityConstraintsProvider; 

    protected abstract override void Execute(NativeActivityContext context); 
} 

SqlActivity:

public sealed class SqlActivity : BaseActivity 
{ 
    public Activity Activity { get; set; } 
} 

public abstract class BaseActivity : Activity 
{ 
    protected ActivityConstraintsProvider ActivityConstraintsProvider; 
} 

MyActivity:

public sealed class MyActivity : BaseActivity 
{ 
    public MyActivity() 
    { 
     ActivityConstraintsProvider = new ActivityConstraintsProvider(); 
     ActivityConstraintsProvider.AddNotAcceptedParentActivity(typeof(SqlActivity)); 
     ActivityConstraintsProvider.AddNotAcceptedParentActivity(typeof(SqlNativeActivity)); 
     base.Constraints.Add(ActivityConstraintsProvider.CheckParent()); 
    } 
} 

我寫了ActivityConstraintsProvider,我在其中定義了List,但沒有接受父類型。 ActivityConstraintsProvider:

public class ActivityConstraintsProvider 
{ 
    private List<Type> _notAcceptedParentActivity; 

    public void AddNotAcceptedParentActivity(Type type) 
    { 
     if (_notAcceptedParentActivity == null) 
      _notAcceptedParentActivity = new List<Type>(); 

     _notAcceptedParentActivity.Add(type); 
    } 

    public Constraint CheckParent() 
    { 
     var element = new DelegateInArgument<Activity>(); 
     var context = new DelegateInArgument<ValidationContext>(); 
     var result = new Variable<bool>(); 
     var parent = new DelegateInArgument<Activity>(); 

     var con = new Constraint<Activity> 
     { 
      Body = new ActivityAction<Activity, ValidationContext> 
      { 
       Argument1 = element, 
       Argument2 = context, 
       Handler = new Sequence 
       { 
        Variables = 
        { 
         result 
        }, 
        Activities = 
        { 
         new ForEach<Activity> 
         {         
          Values = new GetParentChain 
          { 
           ValidationContext = context          
          }, 
          Body = new ActivityAction<Activity> 
          { 
           Argument = parent, 
           Handler = new If() 
           {           
            Condition = new InArgument<bool>((env) => _notAcceptedParentActivity.Contains(parent.Get(env).GetType())),           
            Then = new Assign<bool> 
            { 
             Value = true, 
             To = result 
            }, 
           } 
          } 
         }, 
         new AssertValidation 
         { 
          Assertion = new InArgument<bool> { Expression = new Not<bool, bool> { Operand = result } }, 
          Message = new InArgument<string> ("Decide can't be in Sql"),                 
         } 
        } 
       } 
      } 
     }; 

     return con; 
    } 
} 

最後主營:

class Program 
{ 
    static void Main() 
    { 
     ValidationResults results; 

     Activity wf3 = new SqlActivity 
     { 
      Activity = new Sequence() 
         { 
          Activities = 
          { 
           new MyActivity 
           { 
           } 
          } 
         } 
     }; 
     results = ActivityValidationServices.Validate(wf3); 
     Console.WriteLine("WF3 (SqlActivity):"); 
     PrintResults(results); 

     //---------------------------------------------------------------- 

     Activity wf4 = new SqlNativeActivity 
     { 
      Activity = new Sequence() 
         { 
          Activities = 
          { 
           new MyActivity 
           { 
           } 
          } 
         } 
     }; 
     results = ActivityValidationServices.Validate(wf4); 
     Console.WriteLine("WF4 (SqlNativeActivity):"); 
     PrintResults(results); 

     //---------------------------------------------------------------- 
    }  

    static void PrintResults(ValidationResults results) 
    { 
     Console.WriteLine(); 

     if (results.Errors.Count == 0 && results.Warnings.Count == 0) 
     { 
      Console.WriteLine(" No warnings or errors"); 
     } 
     else 
     { 
      foreach (ValidationError error in results.Errors) 
      { 
       Console.WriteLine(" Error: " + error.Message); 
      } 
      foreach (ValidationError warning in results.Warnings) 
      { 
       Console.WriteLine(" Warning: " + warning.Message); 
      } 
     } 
     Console.WriteLine(); 
    } 
} 

而問題是,如果我的SQL活動是從System.Activities.NativeActivity inherites(SqlNativeActivity)約束工作得很好,但如果我定義了約束條件,父項是來自System.Activities.Activity或System.Activities.CodeActivity約束驗證的活動繼承根本不起作用。 有人可以幫我解決我的問題嗎? 預先感謝您:)

回答

0

如果你創建一個自定義活動(從System.Activities.CodeActivity繼承),您的驗證應該在CacheMetaData完成:

protected override void CacheMetadata(CodeActivityMetadata metadata) 
    { 
     //Validate here 

     base.CacheMetadata(metadata); 
    } 
相關問題