2

리 호스트 된 워크 플로우 디자이너에 대한 사용자 정의 액티비티 작성시, 필자에게 Required Argument에 대해 필요한 값이 있다는 오류가 발생하므로 나는 아래에서 볼 수있는 "null"또는 "ALL"을 사용한다. 기본 인수에 대해 널 또는 "ALL"또는 기타 인수를 허용하지 않습니다. 필자가 요구하는 인자는 string 타입이다. 워크 플로를 실행Workflow Foundation의 사용자 정의 액티비티에 필요한 필수 인수의 기본값

[RequiredArgument] 
[DefaultValue(null)] 
[Description(@"The status of the job to perform")] 
public InArgument<string> JobStatus { get; set; } 

[RequiredArgument] 
[DefaultValue("All")] 
[Description(@"The status of the job to perform")] 
public InArgument<string> JobStatus { get; set; } 

오류 메시지 : 당신의 도움이

+0

그렇다면 'DefaultValue'를 사용하지 않으면 컴파일 오류가 발생한다고 말하는 것입니까? –

+0

아니요 컴파일 오류가 발생하지 않습니다. 프로그램을 실행하면 워크 플로우가 실행되지 않습니다. 나는 오류 메시지를 1 분 안에 게시 할 것이다. – user1298925

+0

왜 먼저 유효성 검사를하지 않고 워크 플로를 실행하고 있습니까? 워크 플로 디자이너가 InArguments에 값이 필요하다는 경고를하지 않습니까? – Joao

답변

5

DefaultValueAttribute에 보이는 것 어느 워크 플로 런타임이나 워크 플로우 디자이너

Workflow Console: Starting Workflow...

Could not start workflow.

Message: Failed to start workflow DynamicActivity.

Exception message: The following errors were encountered while processing the workflow tree: 'DynamicActivity': The private implementation of activity '1: DynamicActivity' has the following validation error: Value for a required activity argument 'JobStatus' was not supplied.

Stack trace: at System.Activities.Validation.ActivityValidationServices.ThrowIfViolationsExist(IList`1 validationErrors) at System.Activities.Hosting.WorkflowInstance.ValidateWorkflow(WorkflowInstanceExtensionManager extensionManager) at System.Activities.Hosting.WorkflowInstance.RegisterExtensionManager(WorkflowInstanceExtensionManager extensionManager) at System.Activities.WorkflowApplication.EnsureInitialized() at System.Activities.WorkflowApplication.Enqueue(InstanceOperation operation, Boolean push) at System.Activities.WorkflowApplication.WaitForTurn(InstanceOperation operation, TimeSpan timeout) at System.Activities.WorkflowApplication.InternalRun(TimeSpan timeout, Boolean isUserRun) at System.Activities.WorkflowApplication.Run()

감사합니다. 속성을 검색하려면 성능에 비용이 많이 드는 반사가 필요합니다. 또한 그것은 속성의 목적이 아닙니다.

어쨌든 변수를 기본값으로 초기화 할 수 있습니다. 생성자에서 예를 들면 다음과 같습니다.

public class MyCodeActivity : CodeActivity 
{ 
    public MyCodeActivity() 
    { 
     JobStatus = "All"; 
    } 
} 

또는 접근자를 통해 값을 강제 설정합니다. 다음과 같은 것 :

이러한 접근 방식은 원하는 동작에 맞는 방법을 사용하십시오. 두 경우 모두 값을 XAML을 통해 항상 수정할 수 있으므로 런타임에 대한 작은 검사가 유용 할 수 있습니다.

protected override void Execute(CodeActivityContext context) 
{ 
    string text = context.GetValue(this.Text); 
    if (text == null) 
    { 
     text = "All"; 
    } 

    Console.WriteLine(text); 
} 
+1

이것을 수행하는 또 다른 방법은 [이 예제] (http://stackoverflow.com/a/3311256/1228) 에서처럼 IActivityTemplateFactory를 구현하는 것입니다. – Will

+0

물론입니다. 불행하게도 이것은 개인적인 견해 일 뿐이며 'IActivityTemplateFactory'는 악의를 띤 것이며 문제를 해결하는 대신 대부분의 문제를 숨기는 경향이 있습니다. 디자인 경험을 완전히 악몽으로 바꿀 수있는 것 외에도. – Joao

+0

감사합니다. 그렇다면 DefaultValue의 목적은 무엇입니까? – user1298925