語言

PersistenceParticipant.MapValues 方法

定義

主機在完成第一階段的值收集後會呼叫此方法。 主機會將兩個只讀字典,內容包含第一階段(CollectValues 階段)中所有持久化參與者收集的值,轉發給此方法進行映射。 主機會將此方法回傳的字典中值加入只寫值集合中。

protected:
 virtual System::Collections::Generic::IDictionary<System::Xml::Linq::XName ^, System::Object ^> ^ MapValues(System::Collections::Generic::IDictionary<System::Xml::Linq::XName ^, System::Object ^> ^ readWriteValues, System::Collections::Generic::IDictionary<System::Xml::Linq::XName ^, System::Object ^> ^ writeOnlyValues);
protected virtual System.Collections.Generic.IDictionary<System.Xml.Linq.XName,object> MapValues(System.Collections.Generic.IDictionary<System.Xml.Linq.XName,object> readWriteValues, System.Collections.Generic.IDictionary<System.Xml.Linq.XName,object> writeOnlyValues);
abstract member MapValues : System.Collections.Generic.IDictionary<System.Xml.Linq.XName, obj> * System.Collections.Generic.IDictionary<System.Xml.Linq.XName, obj> -> System.Collections.Generic.IDictionary<System.Xml.Linq.XName, obj>
override this.MapValues : System.Collections.Generic.IDictionary<System.Xml.Linq.XName, obj> * System.Collections.Generic.IDictionary<System.Xml.Linq.XName, obj> -> System.Collections.Generic.IDictionary<System.Xml.Linq.XName, obj>
Protected Overridable Function MapValues (readWriteValues As IDictionary(Of XName, Object), writeOnlyValues As IDictionary(Of XName, Object)) As IDictionary(Of XName, Object)

參數

readWriteValues
IDictionary<XName,Object>

要持久化的讀寫值。

writeOnlyValues
IDictionary<XName,Object>

這些只寫值要持續保存。

傳回

一個包含額外唯寫值的字典,需持久化。

範例

以下程式碼範例示範在由 衍生 PersistenceParticipant的類別中使用 MapValues 的做法。 此範例來自 企業採購流程 範例。

class XmlPersistenceParticipant : PersistenceParticipant
{
    const string propertiesNamespace = "urn:schemas-microsoft-com:System.Activities/4.0/properties";
    private Guid Id;

    public XmlPersistenceParticipant(Guid id)
    {
        Id = id;
    }

    //Add any additional necessary data to persist here
    protected override void CollectValues(out IDictionary<XName, object> readWriteValues, out IDictionary<XName, object> writeOnlyValues)
    {
        base.CollectValues(out readWriteValues, out writeOnlyValues);
    }

    //Implementations of MapValues are given all the values collected from all participants’ implementations of CollectValues
    protected override IDictionary<XName, object> MapValues(IDictionary<XName, object> readWriteValues, IDictionary<XName, object> writeOnlyValues)
    {
        XName statusXname = XName.Get("Status", propertiesNamespace);

        IDictionary<XName, object> mappedValues = base.MapValues(readWriteValues, writeOnlyValues);

        RequestForProposal requestForProposal = null;
        string status = string.Empty;
        object value = null;

        //retrieve the status of the workflow
        if (writeOnlyValues.TryGetValue(statusXname, out value))
        {
            status = (string)value;
        }

        //retrieve the RequestForProposal object
        foreach (KeyValuePair<System.Xml.Linq.XName, object> item in writeOnlyValues)
        {
            if (item.Value is LocationInfo)
            {
                LocationInfo li = (LocationInfo)item.Value;
                if (li.Value is RequestForProposal)
                {
                    requestForProposal = (RequestForProposal)li.Value;
                }
            }
        }

        IOHelper.EnsureAllRfpFileExists();

        // load the document
        XElement doc = XElement.Load(IOHelper.GetAllRfpsFileName());

        IEnumerable<XElement> current =
                                from r in doc.Elements("requestForProposal")
                                where r.Attribute("id").Value.Equals(Id.ToString())
                                select r;

        if (status == "Closed")
        {
            // erase nodes for the current rfp
            foreach (XElement xe in current)
            {
                xe.Attribute("status").Value = "finished";
            }
        }
        else
        {
            // erase nodes for the current rfp
            foreach (XElement xe in current)
            {
                xe.Remove();
            }

            // get the Xml version of the Rfp, add it to the document and save it
            if (requestForProposal != null)
            {
                XElement e = SerializeRfp(requestForProposal, Id);
                doc.Add(e);
            }
        }

        doc.Save(IOHelper.GetAllRfpsFileName());

        return mappedValues;
    }

備註

所有方法在所有持久化參與者中實作 MapValues 所提供的每個值,包括第一階段(CollectValues 階段)收集的所有值,都必須有一個唯一的 XName。

適用於