다음을 통해 공유


CacheMetadata를 사용하여 데이터 노출

작업을 실행하기 전에 워크플로 런타임은 실행을 유지하는 데 필요한 모든 작업 정보를 얻습니다. 워크플로 런타임은 CacheMetadata 메서드를 실행하는 동안 이 정보를 가져옵니다. 이 메서드의 기본 구현에서는 실행 시 작업에서 노출하는 모든 공용 인수, 변수 및 자식 작업을 런타임에 제공합니다. 작업에서 보다 많은 정보를 런타임에 제공해야 하는 경우(예: 전용 멤버 또는 작업에서 예약될 작업) 이 메서드를 재정의하여 제공할 수 있습니다.

기본 CacheMetadata 동작

CacheMetadata에서 파생되는 작업에 대한 NativeActivity의 기본 구현에서는 다음 메서드 형식을 다음과 같은 방식으로 처리합니다.

  • InArgument<T>, OutArgument<T> 또는 InOutArgument<T>(제네릭 인수): 이러한 인수는 이름과 형식이 노출된 속성 이름 및 형식과 같고 적절한 인수 방향 및 일부 유효성 검사 데이터가 포함된 인수로 런타임에 노출됩니다.

  • Variable 또는 해당 서브클래스: 이러한 멤버는 런타임에 공용 변수로 노출됩니다.

  • Activity 또는 해당 서브클래스: 이러한 멤버는 런타임에 공용 자식 작업으로 노출됩니다. AddImportedChild를 호출하고 자식 작업을 전달하여 기본 동작을 명시적으로 구현할 수 있습니다.

  • ActivityDelegate 또는 해당 서브클래스: 이러한 멤버는 런타임에 공용 대리자로 노출됩니다.

  • ICollection 형식의 Variable: 컬렉션의 모든 요소가 런타임에 공용 변수로 노출됩니다.

  • ICollection 형식의 Activity: 컬렉션의 모든 요소가 런타임에 공용 자식으로 노출됩니다.

  • ICollection 형식의 ActivityDelegate: 컬렉션의 모든 요소가 런타임에 공용 대리자로 노출됩니다.

CacheMetadata, ActivityCodeActivity에서 파생되는 작업에 대한 AsyncCodeActivity도 다음과 같은 차이점을 제외하고 위와 동일하게 작동합니다.

  • Activity에서 파생되는 클래스는 자식 작업이나 대리자를 예약할 수 없으므로 이러한 멤버는 가져온 자식 및 대리자로 노출됩니다.

  • CodeActivityAsyncCodeActivity에서 파생되는 클래스는 변수, 자식 또는 대리자를 지원하지 않으므로 인수만 노출됩니다.

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를 사용하여 구현 자식 노출

변수를 사용하여 작업에서 예약될 자식 작업에 데이터를 전달하려면 변수를 구현 변수로 추가해야 합니다. 공용 변수의 값은 이런 방식으로 설정할 수 없습니다. 이것은 작업이 속성을 가진 캡슐화된 클래스가 아니라 매개 변수를 가진 함수의 구현으로 실행되기 때문입니다. 하지만 예약된 작업은 자식 작업과 동일한 방식으로 부모 작업의 인수에 액세스할 수 없기 때문에 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);
    }
}