Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A deklaratív korlátozások hatékony érvényesítési módszert biztosítanak egy tevékenységhez és más tevékenységekkel való kapcsolataihoz. A kényszerek a létrehozási folyamat során konfigurálva vannak egy tevékenységhez, de a munkafolyamat-gazdagép további korlátozásokat is megadhat. Ez a témakör áttekintést nyújt arról, hogy deklaratív korlátozások használatával biztosít-e tevékenységérvényesítést.
Deklaratív korlátozások használata
A kényszer olyan tevékenység, amely érvényesítési logikát tartalmaz. Ez a kényszertevékenység kódban vagy XAML-ben is létrehozható. A kényszertevékenység létrehozása után a tevékenység szerzői hozzáadják ezt a kényszert az Constraints tulajdonsághoz az érvényesítendő tevékenységnél, vagy a AdditionalConstraints tulajdonságot felhasználva további érvényesítést végeznek egy ValidationSettings példányon. Az érvényesítési logika olyan egyszerű érvényesítésekből állhat, mint például egy tevékenység metaadatainak ellenőrzése, de olyan érvényesítést is végrehajthat, amely figyelembe veszi az aktuális tevékenység szülő-, gyermek- és testvértevékenységekkel való kapcsolatát. A korlátozásokat a Constraint<T> tevékenység használatával hozhatja létre, és számos további érvényesítési tevékenység is rendelkezésre áll az érvényesítési hibák és figyelmeztetések létrehozásához, valamint a munkafolyamat kapcsolódó tevékenységeivel kapcsolatos információk biztosításához.
AssertValidation és AddValidationError
A AssertValidation tevékenység kiértékeli a Assertion tulajdonság által hivatkozott kifejezést, és ha a kifejezés igazra értékelődik ki, érvényesítési hiba vagy figyelmeztetés hozzáadva van a false-hoz. A Message tulajdonság az érvényesítési hibát írja le, a IsWarning tulajdonság pedig azt jelzi, hogy az érvényesítési hiba hiba vagy figyelmeztetés-e. A IsWarning alapértelmezett értéke false.
Az alábbi példában egy olyan korlátozás van deklarálva, amely érvényesítési figyelmeztetést ad vissza, ha az DisplayName érvényesítendő tevékenység két karakterből vagy annál rövidebbből áll. A kényszer Constraint<T> által érvényesített tevékenység típusát az általános típusparaméter határozza meg. Ez a korlátozás általános típusként használatos Activity , és az összes tevékenységtípus ellenőrzésére használható.
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."),
}
}
};
}
Egy tevékenységre vonatkozó korlátozás megadásához a program hozzáadja a Constraints tevékenységhez, ahogyan az az alábbi példakódban látható.
public sealed class SampleActivity : CodeActivity
{
public SampleActivity()
{
base.Constraints.Add(ActivityDisplayNameIsNotSetWarning());
}
// Activity implementation omitted.
}
A házigazda a munkafolyamat tevékenységeire vonatkozó korlátozást a következő szakaszban ismertetett AdditionalConstraints módon is meghatározhatja.
A AddValidationError tevékenység arra szolgál, hogy érvényesítési hibát vagy figyelmeztetést generáljon egy kifejezés kiértékelése nélkül. Tulajdonságai hasonlóak a AssertValidation-hoz, és együtt használhatók egy kényszerrel kapcsolatos folyamatszabályozási tevékenységekkel, mint például a If tevékenység.
Munkafolyamat-kapcsolati tevékenységek
Számos érvényesítési tevékenység érhető el, amelyek információt nyújtanak a munkafolyamat többi tevékenységéről az érvényesítendő tevékenységgel kapcsolatban. GetParentChain olyan tevékenységgyűjteményt ad vissza, amely az aktuális tevékenység és a gyökértevékenység közötti összes tevékenységet tartalmazza. GetChildSubtree Olyan tevékenységgyűjtemény, amely rekurzív mintában tartalmazza a gyermektevékenységeket, és GetWorkflowTree lekéri a munkafolyamat összes tevékenységét.
Az alábbi példában egy CreateState tevékenység van definiálva. A CreateState tevékenységet egy CreateCountry tevékenységen belül kell tárolni, és a GetParent metódus egy kényszert ad vissza, amely kényszeríti ezt a követelményt.
GetParent a GetParentChain tevékenység és egy ForEach<T> tevékenység együttes használatával vizsgálja meg a CreateState tevékenység szülőtevékenységét annak megállapítására, hogy teljesül-e a követelmény.
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
}
}
További korlátozások
A munkafolyamatok gazdaszerzői további érvényességi korlátozásokat adhatnak meg a tevékenységekhez, ha megkötéseket hoznak létre, és hozzáadják őket egy AdditionalConstraintsValidationSettings példány szótárához. Minden elem tartalmazza AdditionalConstraints azt a tevékenységtípust, amelyre a korlátozások vonatkoznak, valamint az adott tevékenységtípusra vonatkozó további korlátozások listáját. Amikor a munkafolyamat érvényesítést hív meg, a megadott típusú minden tevékenység, beleértve a származtatott osztályokat is, kiértékeli a korlátozásokat. Ebben a példában az ActivityDisplayNameIsNotSetWarning előző szakasz kényszerét a munkafolyamat összes tevékenységére alkalmazza a rendszer.
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);
}
}
Ha a OnlyUseAdditionalConstraints tulajdonsága ValidationSettings, azaz true, akkor csak a megadott további korlátozásokat értékelik ki, amikor az érvényesítést a Validate hívásával hajtják végre. Ez hasznos lehet a munkafolyamatok adott ellenőrzési konfigurációinak vizsgálatához. Vegye figyelembe azonban, hogy a munkafolyamat meghívásakor a rendszer kiértékeli a munkafolyamatban konfigurált érvényesítési logikát, és át kell adnia a munkafolyamat sikeres megkezdéséhez. Az érvényesítés meghívásával kapcsolatos további információkért lásd: Tevékenységérvényesítés meghívása.