创建自定义持久性参与者

时间:2013-09-19 14:59:06

标签: c# workflow-foundation-4 workflow-foundation

我正在尝试为我的应用程序编写示例PersistenceParticipant。

它不存储[System.Activities.DurableInstancing]中的属性。[InstancePromotedProperties]

工作流似乎没有给出任何错误,但也不会进行保存。

  public class MyPersistanceParticipant : PersistenceParticipant
{
    public string MovieName;
    public string Rating;
    public Decimal Price;
    static XNamespace xNS = XNamespace.Get("IamaUniqueNamespace");


    //static XNamespace test = XNamespace.Get("clr-namespace:MovieRental.DataModel;assembly=MovieRental.DataModel");
    //static XName currentCountName = stepCountNamespace.GetName("MovieName");

    protected override  void CollectValues(out IDictionary<System.Xml.Linq.XName, object> readWriteValues, out IDictionary<System.Xml.Linq.XName, object> writeOnlyValues)
    {
        //readWriteValues = new Dictionary<XName, object>();
        //readWriteValues.Add(xNS.GetName("MovieName"), this.MovieName);
        //readWriteValues.Add(xNS.GetName("Rating"), this.Rating);
        //readWriteValues.Add(xNS.GetName("Price"), this.Price);
        readWriteValues = null;
        writeOnlyValues = new Dictionary<XName, object>();
        writeOnlyValues.Add(xNS.GetName("MovieName"), this.MovieName);
        writeOnlyValues.Add(xNS.GetName("Rating"), this.Rating);
        writeOnlyValues.Add(xNS.GetName("Price"), this.Price);
        //base.CollectValues(out readWriteValues, out writeOnlyValues);
    }
    protected override void PublishValues(IDictionary<XName, Object> readWriteValues)
    {
        object loadedData;
        if (readWriteValues.TryGetValue(MovieName, out loadedData))
        {
            this.MovieName = (string)loadedData;
        }
    }
    protected override IDictionary<XName, object> MapValues(IDictionary<XName, object> readWriteValues, IDictionary<XName, object> writeOnlyValues)
    {
        return base.MapValues(readWriteValues, writeOnlyValues);
    }
}

我已使用下面的代码

将持久性存储添加到应用程序中
      MyPersistanceParticipant ps = new MyPersistanceParticipant();
            _wfApp.Extensions.Add(ps);

我还添加了代码活动

 public class MakePersistanceHappen : CodeActivity
{

    protected override void Execute(CodeActivityContext context)
    {
        context.GetExtension<MyPersistanceParticipant>().MovieName = "Pursuit of Persistance";
        context.GetExtension<MyPersistanceParticipant>().Rating = "VH";
        context.GetExtension<MyPersistanceParticipant>().Price = Convert.ToDecimal(1);

    }
}

当我调试CollectValues函数时,我可以看到代码运行正常,我能够在即时窗口中看到值。但数据不会存储在商店中。

关于可能出错的指示?

我怀疑我是否正确使用名称空间

静态XNamespace xNS = XNamespace.Get(“IamaUniqueNamespace”);

我尝试了一些名称,包括Workflow XAML文件中的一个,但似乎都没有。 有没有办法可以调试出错的地方?我根本没有任何错误。

编辑1: 我能够解决我的问题 我必须添加新的提升属性,以确保它们保存在[System.Activities.DurableInstancing]中。[InstancePromotedPropertiesTable] 并确保查询字符串是正确的。

 //Add promoted properties 
        XNamespace dataNamespace = XNamespace.Get("IamaUniqueNamespace");
        List<XName> variantProperties = new List<XName>();
        variantProperties.Add(dataNamespace.GetName("MovieName"));
        variantProperties.Add(dataNamespace.GetName("Rating"));
        variantProperties.Add(dataNamespace.GetName("Price"));
        _instanceStore.Promote("additionalProperty", variantProperties, null);


        InstanceHandle handle = _instanceStore.CreateInstanceHandle();
        InstanceView view = _instanceStore.Execute(handle,
                                                        new CreateWorkflowOwnerCommand(),
                                                        TimeSpan.FromSeconds(5));
        handle.Free();
        _instanceStore.DefaultInstanceOwner = view.InstanceOwner;

        // Add instance stoe to app
        wfApp.InstanceStore = _instanceStore;
       // Add persistance participant as extension
        MyPersistanceParticipant mp = new MyPersistanceParticipant();
        wfApp.Extensions.Add(mp);

编辑2:我在这个问题背后的意图是让PersistenceParticipant在[System.Activities.DurableInstancing]中存储其他属性。[InstancePromotedPropertiesTable] 现在我想到了,我提出这个问题的方式可能不太清楚。

0 个答案:

没有答案