2016-11-22 5 views
0

나는 내가 그 내에서 액세스 할 수있는 '변수'의 세트와 함께 (VB) 식을 실행하는 개념을 테스트하기 위해 만든 다음 WF 활동을 표현.Windows 워크 플로 사용자 작업 : 오류 참조하는 식을 평가할 때 변수

public class ExpressionEncapsulationActivity : NativeActivity<bool> 
    { 
    private readonly Collection<Variable> _variables = new Collection<Variable>(); 
    private readonly Collection<Activity> _activities = new BindingList<Activity>(); 
    private Assign _expressionEvaluationChild { get; set; } 
    private Variable<bool> _expressionResultVariable; 

    public Collection<Variable> Variables { get { return _variables; } } 
    public InArgument<bool> Expression { get; set; } 

    protected override void CacheMetadata(NativeActivityMetadata metadata) 
    { 
     base.CacheMetadata(metadata); 
     DisplayName = "Expression Encapsulation"; 

     metadata.SetVariablesCollection(Variables); 
     metadata.SetChildrenCollection(_activities); 

     _expressionResultVariable = new Variable<bool>("evalResult"); 
     _expressionEvaluationChild = new Assign() 
     { 
     DisplayName = "Expression Encapsulation Assign", 
     To = new OutArgument<bool>(_expressionResultVariable), 
     Value = new InArgument<bool>((ctx) => Expression.Get(ctx)) 
     }; 

     metadata.AddImplementationVariable(_expressionResultVariable); 
     metadata.AddImplementationChild(_expressionEvaluationChild); 
    } 

    protected override void Execute(NativeActivityContext context) 
    { 
     context.ScheduleActivity(_expressionEvaluationChild, OnExpressionEvaluationComplete); 
    } 

    protected void OnExpressionEvaluationComplete(NativeActivityContext context, ActivityInstance completedActivity) 
    { 
     Result.Set(context, _expressionResultVariable.Get(context)); 
    } 

    } 

그리고 다음과 같은 활동을 테스트하기 위해 노력하고있어 : (클래스 ForEachActivityItem은 간단과에 Id 속성이있다)

var testVarItem = new ForEachActivityItem() 
    { 
    Id = 2 
    }; 
    var workflow = new ExpressionEncapsulationActivity() 
    { 
    Variables = 
    { 
     new Variable<ForEachActivityItem>("var", (ctx) => testVarItem) 
    }, 
    Expression = new InArgument<bool>(new VisualBasicValue<bool>("var.Id = 1")) 
    }; 
    var result = WorkflowInvoker.Invoke(workflow); 
    Assert.IsFalse(result, "Test #1"); 

을하지만,이 테스트는 오류 발생 :

을 변수 (var에)가 할당 채널 인 표현의 실행 컨텍스트에 '부모'활동 (선언됩니다으로 표현을 사용할 수없는 이유

System.Activities.InvalidWorkflowException: The following errors were encountered while processing the workflow tree: 'VisualBasicValue': Compiler error(s) encountered processing expression "var.Id = 2". 'var' is not declared. It may be inaccessible due to its protection level.

나는 볼 수 없습니다 ExpressionEncapsulationActivity 활동 내에서 작성된 활동).

그것은 전달 된 표현식이 변수를 참조하지 않는 경우 테스트가 작동 주목할 가치가있을 수도 있습니다 (예를 들어, "1 = 1"). 그것은 내가 Sequence 활동을 사용하는 경우 내가 의 변수를 설정하고 표현식을 평가 그것은에 Assign 자식 활동을 추가하는 작업 표현의 이런 종류를 얻을 수있는 것 또한 흥미 롭다. 내 문제는 민간 및 공공의 메타 데이터 '의 차이에 대한 이해의 부족에서 비롯처럼

답변

0

보인다.

More on this here:

https://stackoverflow.com/questions/36068737/how-to-call-an-activity-inside-another-activity-in-microsoft-workflow

전자 (개인)

은 메타 데이터 형식의 AddImplementationXXX 방법 및 폼 위해서, addXXX (예컨대하는 AddChild)의 방법으로 후자에 등록된다.

민간 및 공공 '영역'잘 혼합하지 않는다 (전혀?). 위의 질문에있는 유형의 개인 하위 활동은 예를 들어 공용 변수에 액세스 할 수 없습니다. 내 질문의 테스트에서 설정되는 변수 (속성의 변수)는 공개입니다.

(내가 교정에서 말하는)를 등록하기위한 적절한 속성을 찾기 위해 반사를 사용하는() base.CacheMetadata에 무슨와 관련된주의해야 할 많은도 있습니다. 자식과 변수가 어떻게 등록되는지 더 잘 제어하려면 base.CacheMetadata()를 호출하지 않는 것이 좋습니다.

또 다른 '스패너'I가 발생

은 활동 내에서 정의 된 공용 변수가 활동 내에서 액세스 할 수없는 것이 었습니다 - 그들은 (공개) 자식 활동 만 액세스 할 수 있습니다. 이로 인해 Result 속성에 결과를 반환하는 결과 반환 공용 어린이 작업 (예 : NativeActivity)이 까다로워집니다. 자연적인 접근법은 '결과'(OutArgument)를 변수에 바인딩 한 다음 그 결과를 추출하기 위해 variable.Get (context)을 사용하여 그 결과를 추출하고자하는 것입니다.

이 작업을 수행 할 수 없습니다. 'result'매개 변수를 사용하는 'Completed'이벤트 메소드를 구현해야합니다. 예 :

private void OnFuncEvaluationComplete(NativeActivityContext context, 
        ActivityInstance completedinstance, bool result) 
{ 
    Result.Set(context, result); // Set my result to that returned by the child activity 
} 

그리고 재미는 모두있었습니다.