Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
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.
- dinamik güncelleştirme için iş akışı tanımını hazırlayın.
- İş akışı tanımını istenen değişiklikleri yansıtacak şekilde güncelleştirin.
- Güncelleştirme haritasını oluşturun.
- Güncelleştirme eşlemesini istenen kalıcı iş akışı örneklerine uygulayın.
Uyarı
Güncelleştirme haritasının oluşturulmasını kapsayan 1 ile 3 arasında adımlar, güncelleştirmenin uygulanmasından bağımsız olarak gerçekleştirilebilir. Yaygın bir senaryo, iş akışı geliştiricisinin güncelleştirme haritasını çevrimdışı oluşturması ve ardından bir yöneticinin güncelleştirmeyi daha sonra uygulamasıdır.
Bu makalede, 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ğlanır.
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 işlem, DynamicUpdateServices.PrepareForUpdate yöntemini çağırarak 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 ardından genel aktiviteler ve değişkenler gibi etiketlenmesi gereken tüm nesneleri belirlemek için iş akışı ağacında gezinir, böylece daha sonra değiştirilen iş akışı tanımıyla karşılaştırılabilirler. 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 amacıyla ActivityBuilder içine yüklenebilir ve ardından ActivityBuilderDynamicUpdateServices.PrepareForUpdate içine geçirilir.
Uyarı
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, birkaç alt etkinlik içeren bir MortgageWorkflow
tanımını barındıran bir Sequence tanımı, bir ActivityBuilder içerisine yüklenir ve ardından dinamik güncelleştirme için hazırlanır. Yöntem döndürüldükten sonra, ActivityBuilder özgün iş akışı tanımını ve bir kopyasını içeriyor.
// 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ışmakta olan bir etkinliği kaldıramaz veya çalışmakta olan bir delegasyonun 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 VerifyAppraisal
'in gövdesini oluşturan Dizilim'e özel bir MortgageWorkflow
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üncelleme haritası 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üncelleme haritası oluşturmak için DynamicUpdateServices.CreateUpdateMap 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);
}
DynamicUpdateServices.CreateUpdateMap geri döndüğünde, kopyalanan iş akışı tanımı ve DynamicUpdateServices.PrepareForUpdate çağrısına eklenen diğer dinamik güncelleme bilgileri kaldırılır. Değiştirilen iş akışı tanımı, güncellenmiş iş akışı örnekleri devam ettirilirken daha sonra kullanılabilmesi için kaydedilmeye hazır hale gelir. Aşağıdaki örnekte, değiştirilen iş akışı tanımı öğesine MortgageWorkflow_v1.1.xaml
kaydedilir.
// 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. DynamicUpdateMap örneği, DynamicUpdateServices.CreateUpdateMap tarafından döndürüldüğünde hemen kullanılabilir veya daha sonra güncelleme haritasının kaydedilmiş bir kopyası kullanılarak da yapılabilir. Bir iş akışı örneğini güncellemek için, onu WorkflowApplicationInstanceWorkflowApplication.GetInstance içine yükleyin. Ardından, güncelleştirilmiş iş akışı tanımını ve istenen WorkflowApplicationöğesini kullanarak bir WorkflowIdentity 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, WorkflowApplication.Load'in DynamicUpdateMap kabul eden aşırı yüklemesi kullanılarak yüklenir ve ardından WorkflowApplication.Unload çağrısı ile kaldı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 Sürdürme
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.
Uyarı
WorkflowApplication ve WorkflowIdentity ile ç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(...);