Aracılığıyla paylaş


Etkinlik Doğrulamayı Çağırma

Etkinlik doğrulama, yürütmeden önce herhangi bir etkinliğin yapılandırmasındaki hataları belirlemek ve raporlamak için bir yöntem sağlar. İş akışı tasarımcısında bir iş akışı değiştirildiğinde ve iş akışı tasarımcısında tüm doğrulama hataları veya uyarıları görüntülendiğinde doğrulama gerçekleşir. Doğrulama, bir iş akışı çağrıldığında çalışma zamanında da gerçekleşir ve herhangi bir doğrulama hatası oluşursa, varsayılan doğrulama mantığı tarafından bir InvalidWorkflowException oluşturulur. Windows Workflow Foundation (WF), bir etkinliği açıkça doğrulamak için iş akışı uygulaması ve araç geliştiricileri tarafından kullanılabilecek sınıfı sağlar ActivityValidationServices . Bu konu başlığında etkinlik doğrulaması gerçekleştirmek için nasıl kullanılacağı ActivityValidationServices açıklanmaktadır.

ActivityValidationServices'i Kullanma

ActivityValidationServices bir etkinliğin doğrulama mantığını çağırmak için kullanılan iki Validate aşırı yüklemeye sahiptir. İlk aşırı yükleme, doğrulanacak kök etkinliği alır ve doğrulama hataları ve uyarılarından oluşan bir koleksiyon döndürür. Aşağıdaki örnekte, iki gerekli bağımsız değişkeni olan özel Add bir etkinlik kullanılmıştır.

public sealed class Add : CodeActivity<int>
{
    [RequiredArgument]
    public InArgument<int> Operand1 { get; set; }

    [RequiredArgument]
    public InArgument<int> Operand2 { get; set; }

    protected override int Execute(CodeActivityContext context)
    {
        return Operand1.Get(context) + Operand2.Get(context);
    }
}

Bu Add etkinliği Sequence içinde kullanılır, ancak aşağıdaki örnekte gösterildiği gibi gerekli iki bağımsız değişken bağlanmamıştır.

Variable<int> Operand1 = new Variable<int>{ Default = 10 };
Variable<int> Operand2 = new Variable<int>{ Default = 15 };
Variable<int> Result = new Variable<int>();

Activity wf = new Sequence
{
    Variables = { Operand1, Operand2, Result },
    Activities =
    {
        new Add(),
        new WriteLine
        {
            Text = new InArgument<string>(env => "The result is " + Result.Get(env))
        }
    }
};

Bu iş akışı çağrılarak Validate doğrulanabilir. Validate , aşağıdaki örnekte gösterildiği gibi etkinlik ve alt öğeler tarafından kapsanan doğrulama hatalarının veya uyarılarının bir koleksiyonunu döndürür.

ValidationResults results = ActivityValidationServices.Validate(wf);

if (results.Errors.Count == 0 && results.Warnings.Count == 0)
{
    Console.WriteLine("No warnings or errors");
}
else
{
    foreach (ValidationError error in results.Errors)
    {
        Console.WriteLine("Error: {0}", error.Message);
    }
    foreach (ValidationError warning in results.Warnings)
    {
        Console.WriteLine("Warning: {0}", warning.Message);
    }
}

Bu örnek iş akışında çağrıldığında Validate iki doğrulama hatası döndürülür.

Hata: 'İşlenen2' gerekli etkinlik bağımsız değişkeni için değer sağlanmadı.Hata: 'İşlenen1' gerekli etkinlik bağımsız değişkeni için değer sağlanmadı. Bu iş akışı çağrılırsa, aşağıdaki örnekte gösterildiği gibi bir hata oluşturulur.

try
{
    WorkflowInvoker.Invoke(wf);
}
catch (Exception ex)
{
    Console.WriteLine(ex);
}

System.Activities.InvalidWorkflowException:İş akışı ağacı işlenirken aşağıdaki hatalarla karşılaşıldı:'Ekle': Gerekli etkinlik bağımsız değişkeni 'Operand2' için değer sağlanmadı.'Ekle': Gerekli bir etkinlik bağımsız değişkeni olan 'Operand1' değeri sağlanmadı. Bu örnek iş akışının geçerli olması için etkinliğin gerekli iki bağımsız değişkeninin Add bağlı olması gerekir. Aşağıdaki örnekte, gerekli iki bağımsız değişken, sonuç değeriyle birlikte iş akışı değişkenlerine bağlıdır. Bu örnekte, Result bağımsız değişkeni, gerekli olan diğer iki bağımsız değişkenle birlikte bağlanmıştır. Bağımsız değişkenin Result bağlı olması gerekmez ve bağlı değilse doğrulama hatasına neden olmaz. Değeri iş akışında başka bir yerde kullanılıyorsa bağlamak Result iş akışı yazarının sorumluluğundadır.

new Add
{
    Operand1 = Operand1,
    Operand2 = Operand2,
    Result = Result
}

Kök Etkinlikte Gerekli Argümanları Doğrulama

bir iş akışının kök etkinliğinde bağımsız değişkenler varsa, bunlar iş akışı çağrılana ve parametreler iş akışına geçirilene kadar bağlanmaz. Aşağıdaki iş akışı doğrulamayı geçirir, ancak aşağıdaki örnekte gösterildiği gibi iş akışı gerekli bağımsız değişkenler geçirilmeden çağrılırsa bir özel durum oluşturulur.

Activity wf = new Add();

ValidationResults results = ActivityValidationServices.Validate(wf);
// results has no errors or warnings, but when the workflow
// is invoked, an InvalidWorkflowException is thrown.
try
{
    WorkflowInvoker.Invoke(wf);
}
catch (Exception ex)
{
    Console.WriteLine(ex);
}

System.ArgumentException: Kök etkinliğin bağımsız değişken ayarları yanlış.İş akışı tanımını düzeltin veya şu hataları düzeltmek için giriş değerleri sağlayın:'Ekle': Gerekli etkinlik bağımsız değişkeni 'Operand2' için değer sağlanmadı.'Ekle': Gerekli bir etkinlik bağımsız değişkeni olan 'Operand1' değeri sağlanmadı. Doğru bağımsız değişkenler geçirildikten sonra, aşağıdaki örnekte gösterildiği gibi iş akışı başarıyla tamamlanmaktadır.

Add wf = new Add();

ValidationResults results = ActivityValidationServices.Validate(wf);
// results has no errors or warnings, and the workflow completes
// successfully because the required arguments were passed.
try
{
    Dictionary<string, object> wfparams = new Dictionary<string, object>
    {
        { "Operand1", 10 },
        { "Operand2", 15 }
    };

    int result = WorkflowInvoker.Invoke(wf, wfparams);
    Console.WriteLine("Result: {0}", result);
}
catch (Exception ex)
{
    Console.WriteLine(ex);
}

Uyarı

Örneğin bu sefer, kök etkinlik önceki örnekte olduğu gibi Activity yerine Add olarak bildirildi. WorkflowInvoker.Invoke yöntemi, out etkinliğinin Add sonuçlarını temsil eden tek bir tamsayı yerine bağımsız değişken sözlüğü döndürmesine olanak tanır. Değişken wf, Activity<int> olarak da ilan edilebilirdi.

Kök bağımsız değişkenleri doğrularken, iş akışı çağrıldığında tüm gerekli bağımsız değişkenlerin geçirildiğinden emin olmak konak uygulamanın sorumluluğundadır.

Emperatif Kod Temelli Doğrulamayı Çağırma

Kesinlik temelli kod tabanlı doğrulama, bir etkinliğin kendisi hakkında doğrulama sağlaması için basit bir yol sağlar ve , CodeActivityve AsyncCodeActivity'den NativeActivitytüretilen etkinlikler için kullanılabilir. Etkinliğe doğrulama hatalarını veya uyarılarını belirleyen doğrulama kodu eklenir. Etkinlikte doğrulama işlemi başlatıldığında, bu uyarılar veya hatalar, Validate tarafından döndürülen koleksiyonda yer alır. Aşağıdaki örnekte bir CreateProduct etkinlik tanımlanmıştır. Cost değerinden Pricebüyükse, geçersiz kılmada CacheMetadata meta veriye bir doğrulama hatası eklenir.

public sealed class CreateProduct : CodeActivity
{
    public double Price { get; set; }
    public double Cost { get; set; }

    // [RequiredArgument] attribute will generate a validation error
    // if the Description argument is not set.
    [RequiredArgument]
    public InArgument<string> Description { get; set; }

    protected override void CacheMetadata(CodeActivityMetadata metadata)
    {
        base.CacheMetadata(metadata);
        // Determine when the activity has been configured in an invalid way.
        if (this.Cost > this.Price)
        {
            // Add a validation error with a custom message.
            metadata.AddValidationError("The Cost must be less than or equal to the Price.");
        }
    }

    protected override void Execute(CodeActivityContext context)
    {
        // Not needed for the sample.
    }
}

Bu örnekte, bir iş akışı CreateProduct etkinliği kullanılarak yapılandırılır. Bu iş akışında Cost, Price değerinden büyüktür ve gerekli Description argümanı ayarlanmamıştır. Doğrulama çağrıldığında aşağıdaki hatalar döndürülür.

Activity wf = new Sequence
{
    Activities =
    {
        new CreateProduct
        {
            Cost = 75.00,
            Price = 55.00
            // Cost > Price and required Description argument not set.
        },
        new WriteLine
        {
            Text = "Product added."
        }
    }
};

ValidationResults results = ActivityValidationServices.Validate(wf);

if (results.Errors.Count == 0 && results.Warnings.Count == 0)
{
    Console.WriteLine("No warnings or errors");
}
else
{
    foreach (ValidationError error in results.Errors)
    {
        Console.WriteLine("Error: {0}", error.Message);
    }
    foreach (ValidationError warning in results.Warnings)
    {
        Console.WriteLine("Warning: {0}", warning.Message);
    }
}

Hata: Maliyet, Fiyattan küçük veya buna eşit olmalıdır.Hata: Gerekli 'Description' etkinlik bağımsız değişkeninin değeri sağlanmadı.

Uyarı

Özel etkinlik yazarları bir etkinliğin CacheMetadata geçersiz kılmasında doğrulama mantığı sağlayabilir. CacheMetadata'dan atılan herhangi bir özel durum doğrulama hatası olarak değerlendirilmez. Bu istisnalar Validate çağrısında kaçacak ve çağıran tarafından işlenmelidir.

ValidationSettings'i kullanma

Varsayılan olarak, ActivityValidationServices tarafından doğrulama çağrıldığında, aktivite ağacındaki tüm aktiviteler değerlendirilir. ValidationSettings üç özelliğini yapılandırarak doğrulamanın birkaç farklı şekilde özelleştirilmesine olanak tanır. SingleLevel , doğrulayıcının etkinlik ağacının tamamını mı yürüyecek yoksa yalnızca sağlanan etkinliğe doğrulama mantığı mı uygulayacağını belirtir. Bu değer için varsayılan değerdir false. AdditionalConstraints bir türden kısıtlamalar listesine ek kısıtlama eşlemesi belirtir. Doğrulanan etkinlik ağacındaki her etkinliğin temel türü için AdditionalConstraints içinde bir arama yapılır. Eşleşen bir kısıtlama listesi bulunursa, listedeki tüm kısıtlamalar etkinlik için değerlendirilir. OnlyUseAdditionalConstraints doğrulayıcının tüm kısıtlamaları mı yoksa yalnızca içinde AdditionalConstraintsbelirtilenleri mi değerlendirdiğini belirtir. Varsayılan değer şudur: false. AdditionalConstraints ve OnlyUseAdditionalConstraints iş akışı barındırıcı yazarlarının FxCop gibi araçlar için ilke kısıtlamaları gibi ek doğrulamalar eklemeleri açısından iş akışlarına faydalıdır. Kısıtlamalar hakkında daha fazla bilgi için bkz. Bildirim Temelli Kısıtlamalar.

Kullanmak için ValidationSettings, istenen özellikleri yapılandırın ve ardından çağrısına Validate geçirin. Bu örnekte, özel Sequence etkinlik içeren bir Add iş akışı doğrulanır. Etkinliğin Add iki gerekli bağımsız değişkeni vardır.

public sealed class Add : CodeActivity<int>
{
    [RequiredArgument]
    public InArgument<int> Operand1 { get; set; }

    [RequiredArgument]
    public InArgument<int> Operand2 { get; set; }

    protected override int Execute(CodeActivityContext context)
    {
        return Operand1.Get(context) + Operand2.Get(context);
    }
}

Aşağıdaki Add etkinlik bir Sequenceiçinde kullanılır, ancak gerekli iki bağımsız değişkeni bağlı değildir.

Variable<int> Operand1 = new Variable<int> { Default = 10 };
Variable<int> Operand2 = new Variable<int> { Default = 15 };
Variable<int> Result = new Variable<int>();

Activity wf = new Sequence
{
    Variables = { Operand1, Operand2, Result },
    Activities =
    {
        new Add(),
        new WriteLine
        {
            Text = new InArgument<string>(env => "The result is " + Result.Get(env))
        }
    }
};

Aşağıdaki örnekte, yalnızca kök Sequence etkinliği doğrulandığı için SingleLevel, true olarak ayarlanmıştır.

ValidationSettings settings = new ValidationSettings
{
    SingleLevel = true
};

ValidationResults results = ActivityValidationServices.Validate(wf, settings);

if (results.Errors.Count == 0 && results.Warnings.Count == 0)
{
    Console.WriteLine("No warnings or errors");
}
else
{
    foreach (ValidationError error in results.Errors)
    {
        Console.WriteLine("Error: {0}", error.Message);
    }
    foreach (ValidationError warning in results.Warnings)
    {
        Console.WriteLine("Warning: {0}", warning.Message);
    }
}

Bu kod aşağıdaki çıkışı görüntüler:

Uyarı veya hata yok Etkinliğin Add bağlı olmayan gerekli bağımsız değişkenleri olsa da doğrulama başarılı olur çünkü yalnızca kök etkinlik değerlendirilir. Bu doğrulama türü, bir tasarımcıdaki tek bir etkinliğin özellik değişikliğinin doğrulanması gibi yalnızca etkinlik ağacındaki belirli öğeleri doğrulamak için kullanışlıdır. Bu iş akışı çağrılırsa, iş akışında yapılandırılan tam doğrulamanın değerlendirildiğini ve bir InvalidWorkflowException oluşturulacağını unutmayın. ActivityValidationServices ve ValidationSettings yalnızca açıkça ana bilgisayar tarafından çağrılan doğrulamayı yapılandırır, iş akışı çağrıldığında gerçekleşen doğrulamayı yapılandırmaz.