【问题标题】:Expose NativeActivity Variables to Workflow Designer向 Workflow Designer 公开 NativeActivity 变量
【发布时间】:2010-06-09 22:00:48
【问题描述】:

我有一个 NativeActivity,其中包含一个 Activity 正文。此活动的目的是在子活动期间将资源公开为Variable。我遇到的问题是 Variable 似乎不能在活动之外使用。我将使用StreamReader 作为示例资源。

ResourceActivity.cs:

[Designer(typeof(ResourceActivityDesigner))]
public sealed class ResourceActivity : NativeActivity
{
    [RequiredArgument]
    public InArgument<string> Path { get; set; }

    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public Activity Body { get; set; }

    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public Variable<StreamReader> Resource { get; set; }

    public ResourceActivity()
    {
        this.Resource = new Variable<StreamReader>
        {
            Default = null,
            Name = "reader"
        };
    }

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        if (this.Path != null) metadata.AddArgument(this.Path);
        if (this.Body != null) metadata.AddChild(this.Body);
        if (this.Resource != null) metadata.AddVariable(this.Resource);
    }

    protected override void Execute(NativeActivityContext context)
    {
        this.Resource.Set(context, new StreamReader(this.Path.Get(context)));
        context.ScheduleActivity(this.Body, new completionCallback(Done), new FaultCallback(Faulted));
    }

    private void Done(NativeActivityContext context, ActivityInstance instance)
    {
        var reader = this.Reader.Get(context);
        if (reader != null) reader.Dispose();
    }

    private void Faulted(NativeActivityFaultContext context, Exception ex, ActivityInstance instance)
    {
        var reader = this.Reader.Get(context);
        if (reader != null) reader.Dispose();
    }
}

我无法在工作流设计器的变量列表中查看“资源”或“阅读器”。我在CacheMetadata 中遗漏了什么吗?

【问题讨论】:

    标签: .net workflow workflow-foundation-4 workflow-activity


    【解决方案1】:

    看来答案是在课堂上添加Collection&lt;Variable&gt;CacheMetadata 是不必要的。

    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public Collection<Variable> Variables { get; private set; }
    
    public ResourceActivity()
    {
        this.Resource = new Variable<StreamReader> { Default = null, Name = "reader" };
        this.Variables = new Collection<Variable>(new [] { this.Resource });
    }
    

    编辑: 不,现在发生错误,指出变量被多次定义。如果我没有将资源添加到变量集合中,它就不会显示出来......

    编辑#2:我将此作为 Microsoft Connect 上的错误提交,并被告知这是一个已知错误,but it is not targetted for a fix in VS 2010. It has been postponed.

    【讨论】:

    • 您的第一个错误是因为变量被序列化为 xaml,因此当它被反序列化时,您的构造函数首先添加变量,然后将反序列化的变量添加到集合中,从而导致该错误。将该代码移动到 IActivityTemplateFactory.Create 中,您将不会出现该错误。您报告的错误似乎是一个不同的错误,其中 Activity 无法为其子项创建和公开变量,同时也能够访问它们。某种范围的BS。有同样的问题。找到解决方法了吗?
    • 顺便说一句,我实际上正在考虑创建一个虚拟子活动,其唯一目的是更新变量。埃芬。可笑。
    • @Will:由于对 WF 的巨大挫败感以及除了琐碎之外的任何事情缺乏任何连贯的文档,我们去重组了该应用程序。 MS 对 WF 的支持是如此可恶,由于缺乏足够的变通方法,我们基本上将应用程序的那部分制作成罐头。如果您添加有关序列化/反序列化的信息作为答案,我会将其标记为已接受。
    • 不,那是k。我不像你那样对WF4失望。能够做一些真正复杂和令人印象深刻的事情。但它一种新产品,因此没有太多关于它的信息。我同意他们可以为 MSDN 文档增加更多的清晰度......在许多主题上。
    【解决方案2】:

    如果您想在 Activity 本身和子项之间共享一个变量,您需要将您的 Body 定义为 ActivityAction 类型而不是 Activity。请参阅 Matt Winkler 的 this 博客文章。

    【讨论】:

      猜你喜欢
      • 2012-09-19
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多