작업을 실행하기 전에 워크플로 런타임은 실행을 유지하기 위해 필요한 활동에 대한 모든 정보를 가져옵니다. 워크플로 런타임은 메서드를 실행하는 CacheMetadata 동안 이 정보를 가져옵니다. 이 메서드의 기본 구현은 실행 시 작업에 의해 노출되는 모든 공용 인수, 변수 및 자식 활동을 런타임에 제공합니다. 활동이 이보다 더 많은 정보를 런타임에 제공해야 하는 경우(예: 프라이빗 멤버 또는 활동에 의해 예약될 활동) 이 메서드를 재정의하여 제공할 수 있습니다.
기본 CacheMetadata 동작
활동이 CacheMetadata에서 파생될 때, NativeActivity의 기본 구현은 다음과 같은 방식으로 다음 메서드 유형을 처리합니다.
InArgument<T>, OutArgument<T>또는 InOutArgument<T> (제네릭 인수): 이러한 인수는 런타임에 노출된 속성 이름 및 형식, 적절한 인수 방향 및 일부 유효성 검사 데이터와 같은 이름과 형식의 인수로 노출됩니다.
Variable 또는 해당 하위 클래스: 이러한 멤버는 런타임에 공용 변수로 노출됩니다.
Activity 또는 해당 하위 클래스의 경우: 이러한 멤버는 런타임에 공용 자식 활동으로 노출됩니다. 기본 동작은 AddImportedChild을(를) 호출하고 자식 활동을 전달하여 명시적으로 구현할 수 있습니다.
ActivityDelegate 또는 해당 하위 클래스: 이러한 멤버는 공용 대리자로 런타임에 노출됩니다.
ICollection 형식 Variable: 컬렉션의 모든 요소는 런타임에 공용 변수로 노출됩니다.
ICollection 형식 Activity: 컬렉션의 모든 요소는 런타임 시 공용 멤버로 노출됩니다.
ICollection 형식 ActivityDelegate: 컬렉션의 모든 요소는 공용 대리자로 런타임에 노출됩니다.
CacheMetadata, Activity, CodeActivity, AsyncCodeActivity에서 파생된 활동의 경우, 다음과 같은 차이점을 제외하고는 위와 동일하게 작동합니다.
Activity에서 파생된 클래스는 자식 활동이나 대리자를 예약할 수 없으므로, 이러한 멤버는 가져온 자식 및 대리자로 공개됩니다.
CodeActivity 및 AsyncCodeActivity로부터 파생된 클래스는 변수, 자식, 대리자를 지원하지 않으므로 인수만 노출됩니다.
런타임에 정보를 제공하기 위해 CacheMetadata 재정의
다음 코드 조각에서는 메서드를 실행하는 CacheMetadata 동안 활동의 메타데이터에 멤버에 대한 정보를 추가하는 방법을 보여 줍니다. 메서드의 기본은 활동에 대한 모든 공용 데이터를 캐시하기 위해 호출됩니다.
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
metadata.AddImplementationChild(this._writeLine);
metadata.AddVariable(this._myVariable);
metadata.AddImplementationVariable(this._myImplementationVariable);
RuntimeArgument argument = new RuntimeArgument("MyArgument", ArgumentDirection.In, typeof(SomeType));
metadata.Bind(argument, this.SomeName);
metadata.AddArgument(argument);
}
CacheMetadata를 사용하여 구현 세부사항 공개
변수를 사용하여 활동에서 예약할 자식 활동에 데이터를 전달하려면 변수를 구현 변수로 추가해야 합니다. public 변수는 해당 값을 이러한 방식으로 설정할 수 없습니다. 그 이유는 작업이 캡슐화된 클래스(속성 포함)가 아닌 함수(매개 변수 포함)의 구현으로 더 많이 실행되기 때문입니다. 그러나 예약된 활동은 자식 활동과 같은 방식으로 부모 활동의 인수에 액세스할 수 없으므로 인수를 사용하는 ScheduleActivity경우와 같이 명시적으로 설정해야 하는 상황이 있습니다.
다음 코드 조각은 네이티브 작업에서 예약된 CacheMetadata작업으로 인수를 전달하는 방법을 보여 줍니다.
public sealed class ChildActivity : NativeActivity
{
public WriteLine _writeLine;
public InArgument<string> Message { get; set; }
private Variable<string> MessageVariable { get; set; }
public ChildActivity()
{
MessageVariable = new Variable<string>();
_writeLine = new WriteLine
{
Text = new InArgument<string>(MessageVariable),
};
}
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
metadata.AddImplementationVariable(this.MessageVariable);
metadata.AddImplementationChild(this._writeLine);
}
protected override void Execute(NativeActivityContext context)
{
string configuredMessage = context.GetValue(Message);
context.SetValue(MessageVariable, configuredMessage);
context.ScheduleActivity(this._writeLine);
}
}
.NET