Dinamik Güncelleştirme

Dinamik güncelleştirme, iş akışı uygulaması geliştiricilerinin kalıcı bir iş akışı örneğinin iş akışı tanımını güncelleştirmeleri için bir mekanizma sağlar. Bu, bir hata düzeltmesi, yeni gereksinimler uygulamak veya beklenmeyen değişiklikleri karşılamak için olabilir. Bu konu, .NET Framework 4.5'te sunulan dinamik güncelleştirme işlevselliğine genel bir bakış sağlar.

Dinamik Güncelleştirme

Kalıcı bir iş akışı örneğine dinamik güncelleştirmeler uygulamak için, kalıcı iş akışı örneğinin istenen değişiklikleri yansıtacak şekilde nasıl değiştirildiğini açıklayan çalışma zamanı yönergelerini içeren bir DynamicUpdateMap oluşturulur. Güncelleştirme eşlemesi oluşturulduktan sonra istenen kalıcı iş akışı örneklerine uygulanır. Dinamik güncelleştirme uygulandıktan sonra, iş akışı örneği yeni güncelleştirilmiş iş akışı tanımı kullanılarak sürdürülebilir. Güncelleştirme haritası oluşturmak ve uygulamak için dört adım gerekir.

  1. dinamik güncelleştirme için iş akışı tanımını hazırlama

  2. İş akışı tanımını istenen değişiklikleri yansıtacak şekilde güncelleştirin

  3. Güncelleştirme eşlemesini oluşturma

  4. güncelleştirme eşlemesini istenen kalıcı iş akışı örneklerine uygulama

Not

Güncelleştirme haritasının oluşturulmasını kapsayan 1 ile 3 arasında adımların, güncelleştirmenin uygulanmasından bağımsız olarak gerçekleştirilebileceğini unutmayın. İş akışı geliştiricisinin güncelleştirme haritasını çevrimdışı oluşturacağı ve ardından bir yöneticinin güncelleştirmeyi daha sonra uygulayacağı yaygın bir senaryodur.

Bu konu, derlenmiş bir Xaml iş akışının kalıcı örneğine yeni bir etkinlik eklemeye yönelik dinamik güncelleştirme işlemine genel bir bakış sağlar.

dinamik güncelleştirme için iş akışı tanımını hazırlama

Dinamik güncelleştirme işleminin ilk adımı, istenen iş akışı tanımını güncelleştirme için hazırlamaktır. Bu, yöntemini çağırarak DynamicUpdateServices.PrepareForUpdate ve değiştirmek için iş akışı tanımını geçirerek yapılır. Bu yöntem, iş akışı ağacını doğrular ve daha sonra değiştirilen iş akışı tanımıyla karşılaştırılabilmeleri için etiketlenmeleri gereken genel etkinlikler ve değişkenler gibi tüm nesneleri tanımlamak için gösterir. Bu tamamlandığında, iş akışı ağacı kopyalanır ve özgün iş akışı tanımına eklenir. Güncelleştirme eşlemesi oluşturulduğunda, iş akışı tanımının güncelleştirilmiş sürümü özgün iş akışı tanımıyla karşılaştırılır ve güncelleştirme haritası farklılıklara göre oluşturulur.

Bir Xaml iş akışını dinamik güncelleştirme için hazırlamak için bir içine ActivityBuilderyüklenebilir ve ardından ActivityBuilder içine geçirilir DynamicUpdateServices.PrepareForUpdate.

Not

ve ActivityBuilderserileştirilmiş iş akışlarıyla çalışma hakkında daha fazla bilgi için bkz . XAML'ye ve XAML'den İş Akışlarını ve Etkinlikleri Seri Hale Getirme.

Aşağıdaki örnekte, bir MortgageWorkflow tanımı (birkaç alt etkinlik içeren bir Sequence tanım) içine ActivityBuilderyüklenir ve dinamik güncelleştirme için hazırlanır. yöntemi döndürdüğünde, ActivityBuilder özgün iş akışı tanımının yanı sıra bir kopyasını içerir.

// Load the MortgageWorkflow definition from Xaml into
// an ActivityBuilder.
XamlXmlReaderSettings readerSettings = new XamlXmlReaderSettings()
{
    LocalAssembly = Assembly.GetExecutingAssembly()
};

XamlXmlReader xamlReader = new XamlXmlReader(@"C:\WorkflowDefinitions\MortgageWorkflow.xaml",
    readerSettings);

ActivityBuilder ab = XamlServices.Load(
    ActivityXamlServices.CreateBuilderReader(xamlReader)) as ActivityBuilder;

// Prepare the workflow definition for dynamic update.
DynamicUpdateServices.PrepareForUpdate(ab);

İş akışı tanımını istenen değişiklikleri yansıtacak şekilde güncelleştirin

İş akışı tanımı güncelleştirilecek şekilde hazırlandıktan sonra istenen değişiklikler yapılabilir. Etkinlik ekleyebilir veya kaldırabilir, ortak değişkenleri ekleyebilir, taşıyabilir veya silebilir, bağımsız değişkenler ekleyebilir veya kaldırabilir ve etkinlik temsilcilerinin imzalarında değişiklik yapabilirsiniz. Çalışan bir etkinliği kaldıramaz veya çalışan bir temsilcinin imzasını değiştiremezsiniz. Bu değişiklikler kod kullanılarak veya yeniden barındırılan bir iş akışı tasarımcısında yapılabilir. Aşağıdaki örnekte, önceki örnekten gövdesini MortgageWorkflow oluşturan Sıralı'ya özel VerifyAppraisal bir etkinlik eklenir.

// Make desired changes to the definition. In this example, we are
// inserting a new VerifyAppraisal activity as the 3rd child of the root Sequence.
VerifyAppraisal va = new VerifyAppraisal
{
    Result = new VisualBasicReference<bool>("LoanCriteria")
};

// Get the Sequence that makes up the body of the workflow.
Sequence s = ab.Implementation as Sequence;

// Insert the new activity into the Sequence.
s.Activities.Insert(2, va);

Güncelleştirme eşlemesini oluşturma

Güncelleştirme için hazırlanan iş akışı tanımı değiştirildikten sonra güncelleştirme haritası oluşturulabilir. Dinamik güncelleştirme eşlemesi DynamicUpdateServices.CreateUpdateMap oluşturmak için yöntemi çağrılır. Bu, çalışma zamanının yeni iş akışı tanımıyla yüklenip sürdürülebilmesi için kalıcı bir iş akışı örneğini değiştirmek için ihtiyaç duyduğu bilgileri içeren bir DynamicUpdateMap döndürür. Aşağıdaki örnekte, önceki örnekten değiştirilen MortgageWorkflow tanım için dinamik bir harita oluşturulur.

// Create the update map.
DynamicUpdateMap map = DynamicUpdateServices.CreateUpdateMap(ab);

Bu güncelleştirme eşlemesi kalıcı iş akışı örneklerini değiştirmek için hemen kullanılabilir veya genellikle kaydedilebilir ve güncelleştirmeler daha sonra uygulanabilir. Güncelleştirme eşlemesini kaydetmenin bir yolu, aşağıdaki örnekte gösterildiği gibi bir dosyaya seri hale getirmektir.

// Serialize the update map to a file.
DataContractSerializer serializer = new DataContractSerializer(typeof(DynamicUpdateMap));
using (FileStream fs = System.IO.File.Open(@"C:\WorkflowDefinitions\MortgageWorkflow.map", FileMode.Create))
{
    serializer.WriteObject(fs, map);
}

Döndürdüğünde DynamicUpdateServices.CreateUpdateMap , kopyalanan iş akışı tanımı ve çağrısına DynamicUpdateServices.PrepareForUpdate eklenen diğer dinamik güncelleştirme bilgileri kaldırılır ve değiştirilen iş akışı tanımı kaydedilmeye hazır olur, böylece güncelleştirilmiş iş akışı örnekleri devam ettirilirken daha sonra kullanılabilir. Aşağıdaki örnekte, değiştirilen iş akışı tanımı öğesine MortgageWorkflow_v1.1.xamlkaydedilir.

// Save the modified workflow definition.
StreamWriter sw = File.CreateText(@"C:\WorkflowDefinitions\MortgageWorkflow_v1.1.xaml");
XamlWriter xw = ActivityXamlServices.CreateBuilderWriter(new XamlXmlWriter(sw, new XamlSchemaContext()));
XamlServices.Save(xw, ab);
sw.Close();

güncelleştirme eşlemesini istenen kalıcı iş akışı örneklerine uygulama

Güncelleştirme haritası oluşturulduktan sonra herhangi bir zamanda uygulanabilir. tarafından döndürülen DynamicUpdateServices.CreateUpdateMapörnek kullanılarak DynamicUpdateMap hemen yapılabilir veya daha sonra güncelleştirme haritasının kaydedilmiş bir kopyası kullanılarak yapılabilir. Bir iş akışı örneğini güncelleştirmek için kullanarak WorkflowApplication.GetInstanceiçine yükleyinWorkflowApplicationInstance. Ardından, güncelleştirilmiş iş akışı tanımını ve istenen WorkflowIdentityöğesini kullanarak bir WorkflowApplication oluşturun. Bu WorkflowIdentity , özgün iş akışını kalıcı hale getirmek için kullanılandan farklı olabilir ve genellikle kalıcı örneğin değiştirildiğini yansıtmak için kullanılır. WorkflowApplication oluşturulduktan sonra, öğesinin DynamicUpdateMapaşırı yüklenmesi WorkflowApplication.Load kullanılarak yüklenir ve ardından çağrısıyla WorkflowApplication.Unloadkaldırılır. Bu, dinamik güncelleştirmeyi uygular ve güncelleştirilmiş iş akışı örneğini kalıcı hale ekler.

// Load the serialized update map.
DynamicUpdateMap map;
using (FileStream fs = File.Open(@"C:\WorkflowDefinitions\MortgageWorkflow.map", FileMode.Open))
{
    DataContractSerializer serializer = new DataContractSerializer(typeof(DynamicUpdateMap));
    object updateMap = serializer.ReadObject(fs);
    if (updateMap == null)
    {
        throw new ApplicationException("DynamicUpdateMap is null.");
    }

    map = (DynamicUpdateMap)updateMap;
}

// Retrieve a list of workflow instance ids that corresponds to the
// workflow instances to update. This step is the responsibility of
// the application developer.
List<Guid> ids = GetPersistedWorkflowIds();
foreach (Guid id in ids)
{
    // Get a proxy to the persisted workflow instance.
    SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(connectionString);
    WorkflowApplicationInstance instance = WorkflowApplication.GetInstance(id, store);

    // If desired, you can inspect the WorkflowIdentity of the instance
    // using the DefinitionIdentity property to determine whether to apply
    // the update.
    Console.WriteLine(instance.DefinitionIdentity);

    // Create a workflow application. You must specify the updated workflow definition, and
    // you may provide an updated WorkflowIdentity if desired to reflect the update.
    WorkflowIdentity identity = new WorkflowIdentity
    {
        Name = "MortgageWorkflow v1.1",
        Version = new Version(1, 1, 0, 0)
    };

    // Load the persisted workflow instance using the updated workflow definition
    // and with an updated WorkflowIdentity. In this example the MortgageWorkflow class
    // contains the updated definition.
    WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identity);

    // Apply the dynamic update on the loaded instance.
    wfApp.Load(instance, map);

    // Unload the updated instance.
    wfApp.Unload();
}

Güncelleştirilmiş İş Akışı Örneğini Devam Ettiriyor

Dinamik güncelleştirme uygulandıktan sonra iş akışı örneği sürdürülebilir. Yeni güncelleştirilmiş tanımın ve WorkflowIdentity kullanılması gerektiğini unutmayın.

Not

ve WorkflowIdentityile WorkflowApplication çalışma hakkında daha fazla bilgi için bkz. WorkflowIdentity ve Versioning kullanma.

Aşağıdaki örnekte, önceki örnekteki MortgageWorkflow_v1.1.xaml iş akışı derlenmiş ve güncelleştirilmiş iş akışı tanımı kullanılarak yüklenip sürdürülmüştür.

// Load the persisted workflow instance using the updated workflow definition
// and updated WorkflowIdentity.
WorkflowIdentity identity = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1.1",
    Version = new Version(1, 1, 0, 0)
};

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identity);

// Configure persistence and desired workflow event handlers.
// (Omitted for brevity.)
ConfigureWorkflowApplication(wfApp);

// Load the persisted workflow instance.
wfApp.Load(InstanceId);

// Resume the workflow.
// wfApp.ResumeBookmark(...);