0

制約をactivityに設定して他のアクティビティに追加しないようにしたいとします。 私はGetParentChainに問題があると思います。WF4制約がActivityおよびCodeActivity親の型と連携しない理由

MyActivity、SqlNativeActivity、およびSqlActivityの3つのアクティビティがあります。

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); 
    } 
関連する問題