Aracılığıyla paylaş


Bildirim Temelli Kısıtlamalar

Bildirim temelli kısıtlamalar, bir etkinlik ve diğer etkinliklerle ilişkileri için güçlü bir doğrulama yöntemi sağlar. Yazma işlemi sırasında bir etkinlik için kısıtlamalar yapılandırılır, ancak iş akışı konağı tarafından ek kısıtlamalar da belirtilebilir. Bu konu, etkinlik doğrulaması sağlamak için bildirim temelli kısıtlamaları kullanmaya genel bir bakış sağlar.

Bildirim Temelli Kısıtlamaları Kullanma

Kısıtlama, doğrulama mantığı içeren bir etkinliktir. Bu kısıtlama etkinliği kodda veya XAML'de yazılabilir. Kısıtlama etkinliği oluşturulduktan sonra, etkinlik yazarları bu kısıtlamayı doğrulamak için Constraints etkinliğin özelliğine ekler veya bir AdditionalConstraints örneğin özelliğini kullanarak ek doğrulama sağlamak için kısıtlamayı ValidationSettings kullanırlar. Doğrulama mantığı, etkinliğin meta verilerini doğrulama gibi basit doğrulamalardan oluşabilir, ancak geçerli etkinliğin üst, alt ve eşdüzey etkinlikleriyle ilişkisini dikkate alan doğrulama da gerçekleştirebilir. Kısıtlamalar Constraint<T> etkinliği ile yazılır ve doğrulama hatalarının ve uyarılarının oluşturulmasına yardımcı olmak ve iş akışındaki ilgili etkinlikler hakkında bilgi sağlamak amacıyla birkaç ek doğrulama etkinliği sunulur.

AssertValidation ve AddValidationError

Etkinlik, AssertValidation özelliği tarafından belirlenen ifadeyi değerlendirir ve ifade Assertion öğesine değerlendirildiğinde, false bir doğrulama hatası veya uyarı eklenir. Message özelliği doğrulama hatasını açıklar ve IsWarning özelliği doğrulama hatasının bir hata mı yoksa uyarı mı olduğunu gösterir. IsWarning için varsayılan değer falsedeğeridir.

Aşağıdaki örnekte, doğrulanan etkinliğin uzunluğu iki karakter veya daha kısaysa DisplayName doğrulama uyarısı döndüren bir kısıtlama bildirilir. için Constraint<T> kullanılan genel tür parametresi, kısıtlama tarafından doğrulanan etkinlik türünü belirtir. Bu kısıtlama genel tür olarak kullanır Activity ve tüm etkinlik türlerini doğrulamak için kullanılabilir.

public static Constraint ActivityDisplayNameIsNotSetWarning()  
{  
    DelegateInArgument<Activity> element = new DelegateInArgument<Activity>();  
  
    return new Constraint<Activity>  
    {  
        Body = new ActivityAction<Activity, ValidationContext>  
        {  
            Argument1 = element,  
            Handler = new AssertValidation  
            {  
                IsWarning = true,  
                Assertion = new InArgument<bool>(env => (element.Get(env).DisplayName.Length > 2)),  
                Message = new InArgument<string>("It is a best practice to have a DisplayName of more than 2 characters."),  
            }  
        }  
    };  
}  

Bir etkinlik için bu kısıtlamayı belirtmek üzere, aşağıdaki örnek kodda gösterildiği gibi, kısıtlama etkinliğin Constraints öğesine eklenir.

public sealed class SampleActivity : CodeActivity  
{  
    public SampleActivity()  
    {  
        base.Constraints.Add(ActivityDisplayNameIsNotSetWarning());  
    }  
  
    // Activity implementation omitted.  
}  

Sunucu, sonraki bölümde ele alınan AdditionalConstraints kullanarak bir iş akışındaki etkinlikler için de bu kısıtlamayı belirtebilir.

Etkinlik AddValidationError , bir ifadenin değerlendirilmesi gerekmeden doğrulama hatası veya uyarısı oluşturmak için kullanılır. Özellikleri AssertValidation ile benzerdir ve If etkinliği gibi bir kısıtlamanın akış kontrol aktiviteleriyle birlikte kullanılabilir.

İş Akışı İlişkisi Etkinlikleri

Doğrulanan etkinlikle ilgili olarak iş akışındaki diğer etkinlikler hakkında bilgi sağlayan çeşitli doğrulama etkinlikleri mevcuttur. GetParentChain geçerli etkinlik ile kök etkinlik arasındaki tüm etkinlikleri içeren bir etkinlik koleksiyonu döndürür. GetChildSubtree iç içe geçmiş bir düzende alt etkinlikleri içeren bir etkinlik koleksiyonu sağlar ve GetWorkflowTree iş akışındaki tüm etkinlikleri alır.

Aşağıdaki örnekte bir CreateState etkinlik tanımlanmıştır. Etkinlik CreateState bir CreateCountry etkinliğin içinde yer almalıdır ve GetParent yöntemi bu gereksinimi uygulayan bir kısıtlama döndürür. GetParent, gereksinimin karşılanıp karşılanmadığını belirlemek amacıyla GetParentChain etkinliğinin üst etkinliklerini incelemek için ForEach<T> etkinliğini bir CreateState etkinliğiyle birlikte kullanır.

public sealed class CreateState : CodeActivity  
{  
    public CreateState()  
    {  
        base.Constraints.Add(CheckParent());  
        this.Cities = new List<Activity>();
    }  
  
    public List<Activity> Cities { get; set; }  
  
    public string Name { get; set; }
  
    static Constraint CheckParent()  
    {  
        DelegateInArgument<CreateState> element = new DelegateInArgument<CreateState>();  
        DelegateInArgument<ValidationContext> context = new DelegateInArgument<ValidationContext>();
        Variable<bool> result = new Variable<bool>();  
        DelegateInArgument<Activity> parent = new DelegateInArgument<Activity>();  
  
        return new Constraint<CreateState>  
        {
            Body = new ActivityAction<CreateState,ValidationContext>  
            {
                Argument1 = element,  
                Argument2 = context,  
                Handler = new Sequence  
                {  
                    Variables =  
                    {  
                        result
                    },  
                    Activities =  
                    {  
                        new ForEach<Activity>  
                        {
                            Values = new GetParentChain  
                            {  
                                ValidationContext = context
                            },  
                            Body = new ActivityAction<Activity>  
                            {
                                Argument = parent,
                                Handler = new If()  
                                {
                                    Condition = new InArgument<bool>((env) => object.Equals(parent.Get(env).GetType(),typeof(CreateCountry))),
                                    Then = new Assign<bool>  
                                    {  
                                        Value = true,  
                                        To = result  
                                    }  
                                }  
                            }
                        },  
                        new AssertValidation  
                        {  
                            Assertion = new InArgument<bool>(result),  
                            Message = new InArgument<string> ("CreateState has to be inside a CreateCountry activity"),
                        }  
                    }  
                }  
            }  
        };  
    }  
  
    protected override void Execute(CodeActivityContext context)  
    {  
        // not needed for the sample  
    }  
}  

Ek Kısıtlamalar

İş akışı ana bilgisayar yazarları, iş akışındaki etkinlikler için ek doğrulama kısıtlamalarını, kısıtlamalar oluşturup bunları bir AdditionalConstraints örneğinin ValidationSettings sözlüğüne ekleyerek belirtebilir. içindeki AdditionalConstraints her öğe, kısıtlamaların uygulandığı etkinlik türünü ve bu etkinlik türü için ek kısıtlamaların listesini içerir. İş akışı için doğrulama çağrıldığında, türetilmiş sınıflar da dahil olmak üzere belirtilen türdeki her etkinlik kısıtlamaları değerlendirir. Bu örnekte, önceki bölümde yer ActivityDisplayNameIsNotSetWarning alan kısıtlama bir iş akışındaki tüm etkinliklere uygulanır.

Activity wf = new Sequence  
{  
    // Workflow Details Omitted.  
};  
  
ValidationSettings settings = new ValidationSettings()  
{  
  
    AdditionalConstraints =  
    {  
        {typeof(Activity), new List<Constraint> {ActivityDisplayNameIsNotSetWarning()}},
    }  
};  
  
// Validate the workflow.  
ValidationResults results = ActivityValidationServices.Validate(wf, settings);  
  
// Evaluate the results.  
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 in " + error.Source.DisplayName + ": " + error.Message);  
    }  
    foreach (ValidationError warning in results.Warnings)  
    {  
        Console.WriteLine("Warning in " + warning.Source.DisplayName + ": " + warning.Message);  
    }  
}  

Eğer OnlyUseAdditionalConstraints özelliği ValidationSettingstrue ise, Validate çağrıldığında yalnızca belirtilen ek kısıtlamalar değerlendirilir. Bu, belirli doğrulama yapılandırmaları için iş akışlarını incelemek için yararlı olabilir. Ancak iş akışı çağrıldığında iş akışında yapılandırılan doğrulama mantığının değerlendirildiğini ve iş akışının başarıyla başlaması için geçmesi gerektiğini unutmayın. Doğrulamayı çağırma hakkında daha fazla bilgi için bkz. Etkinlik Doğrulamayı Çağırma.