Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Jurgen Willis
Microsoft Corporation
Únor 2006
Platí pro:
Windows Workflow Foundation (WF) Beta 2
Visual Studio 2005
Souhrn: Tento článek obsahuje přehled možností modulu pravidel ve Windows Workflow Foundation (WF). Popisuje, jak se podmínky a sady pravidel používají ve WF, a popisuje chování kolekcí pravidel, včetně řetězení a sledování a trasování. (18 tištěných stránek)
Poznámka Tento článek byl napsán pomocí beta 2 a v budoucnu může být nutné provést některé změny, aby to fungovalo na novějších verzích Windows Workflow Foundation.
Obsah
Úvod
Přehled pravidel ve Windows Workflow Foundation
Vyhodnocení pravidel
Řetězení vpřed
Ovládací prvek pro řetězení vpřed
Další diskuze o modelování
Sledování a trasování
Závěr
Další informace
Úvod
S dostupností Windows Workflow Foundation (WF) společnost Microsoft zavádí nové možnosti pravidel pro platformu pro vývojáře WinFX. Tyto funkce se rozšiřují od jednoduchých podmínek, které řídí chování provádění aktivit až po komplexní sady pravidel řetězení s plnou funkcí.
Funkce pravidel umožňuje deklarativní modelování jednotek aplikační logiky v rámci celého obchodního procesu. Ukázkové scénáře pro technologii stroje pravidel jsou ověření objednávek, výpočet cen, vynucení povýšení, správa procesů výjimek a rozhodování a správa deklarací identity.
Klíčovým cílem při vývoji této technologie bylo poskytnout skutečně integrované pracovní postupy a prostředí pravidel. V celém odvětví jsou pravidla a pracovní postupy obvykle poměrně odlišné technologie, které obvykle poskytují různí dodavatelé. Moduly pravidel třetích stran jsou často vložené nebo integrované poskytovateli pracovních postupů a správy obchodních procesů (BPM), ale prostředí pro vývojáře a správu není zjevně bezproblémové.
S WF se Společnost Microsoft velmi zaměřila na zajištění bezproblémového vývojářského prostředí mezi modelováním pracovních postupů a pravidel, aby vývojáři mohli snadno začlenit pravidla v jakémkoli okamžiku do pracovního postupu. Vývojáři se můžou rozhodnout, jestli modelovat logiku v modelu pracovního postupu, pravidlech nebo kódu, aniž by se museli starat o důsledky integrace těchto rozhodnutí. Toho bylo dosaženo, aniž byste obětovali možnost provádět pravidla mimo rozsah pracovního postupu.
Druhým klíčovým cílem bylo poskytnout vývojářům jednoduchý model, který by mohli použít při definování pravidel. Technologie pravidel se zde často stala technologií výklenku, kterou používá vysoce specializovaná skupina odborníků na pravidla. I když vylepšení nástrojů rozšířily sadu jednotlivců používajících pravidla, modely často vyžadovaly, aby uživatelé byli příliš dobře obeznámeni s implementací základního modulu. Při poskytování možností pravidel pro platformu jsme se rozhodli pro model, který bude přístupný širokou komunitou vývojářů .NET a nakonec i bez vývojářů. I když vždy existuje určitá úroveň odborných znalostí v doméně – stejně jako u jakékoli technologie – naším cílem je, aby všichni vývojáři .NET mohli rychle začít pracovat s modelem pravidel a snadno ho začlenit do svých aplikací.
Kromě poskytování přístupného modelu poskytuje WF také výkonný vyhodnocovací modul pro podporu složitých scénářů pravidel, náročné vyhodnocení dopředu a přesné řízení hodnocení. Tato možnost je poskytována způsobem, který poskytuje řadu bodů rozšiřitelnosti, což vývojářům umožňuje vytvářet na naší platformě a poskytovat možnosti pravidel v podpoře širokého spektra scénářů.
Tento dokument obsahuje technický úvod k možnostem pravidel poskytovaných ve WF a přehled dostupných funkcí a jejich použití. Na konci tohoto dokumentu je seznam dalších prostředků, které je možné použít k získání informací o funkcích pravidel ve WF.
Přehled pravidel ve Windows Workflow Foundation
Technologie pravidel je ve WF zpřístupněna dvěma klíčovými způsoby – jako podmínky pro aktivity a jako předávací řetězení RuleSet v aktivitě Zásady. Řetězení vpřed bude popsáno dále v dokumentu; stručně řečeno, odkazuje na schopnost akcí jednoho pravidla způsobit další závislá pravidla, která budou znovu zhodnocená.
Podmínky aktivity
Podmínky se používají v následujících čtyřech aktivitách, které jsou dodávány s WF:
- IfElseBranch
- Zatímco
- Replikátor
- ConditionedActivityGroup (CAG)
Podmínky se používají k řízení chování provádění těchto aktivit – například k určení, jestli se daná funkce IfElseBranch provede. Podmínky lze zadat buď jako CodeConditions, které budou mít nakonfigurovanou obslužnou rutinu v kódu vedle, nebo jako RuleConditionReference. RuleConditionReference odkazuje na definici RuleCondition v souboru .rules přidruženém k pracovnímu postupu v projektu pracovního postupu. Prostředí v sadě Visual Studio je vidět na obrázku 1.
Obrázek 1 Vytváření podmínek pravidla WF
Přidání podmínky pravidla
Jedná se o postup přidání podmínky pravidla do aktivity IfElseBranch, která se nachází uvnitř aktivity IfElse:
- Pokud je vybrána aktivita s podmínkou (stejně jako u zobrazené aktivity IfElseBranch) se v mřížce Properties zobrazí vlastnost Podmínka.
- Rozevírací seznam pro vlastnost Podmínka umožňuje uživateli vybrat CodeCondition nebo RuleConditionReference.
- Pokud je vybraná
RuleConditionReference , lze vlastnost podmínkyrozbalit a zobrazit vlastnosti ConditionName aExpression . - Po zadání názvu podmínky se pro spuštění Editoru podmínek pravidla vyberou tři tečky ve vlastnosti Výraz. Tento editor umožňuje vývojáři zadat podmínku v textové podobě s podporou podobné intellisense. Text se parsuje do reprezentace přidruženého objektového modelu RuleCondition.
- Po výběru OKse definice RuleCondition serializuje do souboru <WorkflowName>.rules, který je přidán do projektu.
Chcete-li odkazovat na pole nebo vlastnosti pracovního postupu, můžete zadat to. do editoru. Po zadání tečky se zobrazí nabídka podobná intellisense, která umožňuje vybrat členy v pracovním postupu (můžete také zadat člena přímo). Vnořené volání lze provést také; například this.order.Total. Statické metody lze volat u odkazovaných typů zadáním názvu třídy následovaného názvem metody, stejně jako v kódu.
Výrazy jsou podporovány následujícími relačními operátory:
- Rovná se ("==" nebo "=")
- Větší než (">")
- Větší než nebo rovno (">=")
- Menší než ("<")
- Menší než nebo rovno ("<=")
Kromě toho můžete použít následující aritmetické operátory:
- Přidat ("+")
- Odečíst ("-")
- Násobení (*)
- Dělit ("/")
- Moduly ("MOD")
Výrazy lze kombinovat nebo negovat pomocí následujících operátorů:
- AND ("AND", "&&")
- OR ("OR", "||")
- NOT ("NOT", "!")
- Bitové a ("&")
- Bitový nebo (|)
Hlavním důvodem, proč vývojář místo podmínky kódu používá podmínku pravidla, je to, že podmínky pravidla se stanou součástí modelu a dají se dynamicky aktualizovat za běhu při provádění instancí pracovního postupu. Sekundární výhodou podmínek pravidla je, že v rámci modelu by mohly být sofistikovanější nástroje postaveny na modelu, aby poskytovaly další prostředí pro vytváření, správu závislostí, analýzu křížových podmínek atd.
Aktivita zásad
Aktivita Zásady zapouzdřuje definici a spuštění sady pravidel. Sada pravidel je kolekce pravidel se sadou sémantiky spouštění. Pravidla jsou zase výrazy If-Then-Else, které pracují s členy pracovního postupu. Prostředí je znázorněno na obrázku 2 a je analogické s podmínkami pravidla.
Obrázek 2 Vytváření sady pravidel WF
Přidání aktivity zásad
Pokud chcete nakonfigurovat sadu pravidel pro aktivitu zásad, postupujte takto:
- Přetáhněte aktivitu zásad z panelu nástrojů do návrháře pracovního postupu.
- V RuleSetReference je zadaný název pro RuleSet.
- Výběrem tří teček v poli definice sady pravidel se spustí editor sady pravidel.
- Editor zobrazuje kolekci pravidel v seznamu.
- Výběrem daného pravidla se zobrazí její podmínka, akce, akce Else a sada dalších vlastností.
- Stejně jako v Editoru podmínek pravidel se akce Podmínka, Pak a Else zadávají jako text a parsují se do reprezentace přidruženého objektového modelu; pravidla jsou sestavena proti členům pracovního postupu.
- Výběrem OK serializuje RuleSet na soubor .rules přidružený k pracovnímu postupu.
Všimněte si, že výběrem tří teček ve vlastnosti RuleSetReference se spustí editor, který uživateli umožňuje vybrat existující sadu pravidel nebo přidat nebo přejmenovat nebo odebrat sady pravidel, jak je znázorněno na obrázku 3.
Obrázek 3 Prohlížeč sady pravidel WF
Vyhodnocení pravidel
Každé pravidlo v sadě pravidel má hodnotu priority s výchozí hodnotou 0. Pravidla v sadě pravidel lze považovat za seřazenou kolekci seřazenou podle hodnot priority. Vyhodnocovače pravidel WF vyhodnocuje pravidla jednotlivě a provádí akce pravidla na základě výsledků vyhodnocení podmínky pravidla.
Mechanismus hodnocení lze koncepčně popsat následujícím postupem:
- Začněte seznamem aktivních pravidel.
- Najděte pravidlo s nejvyšší prioritou.
- Vyhodnoťte pravidlo a podle potřeby proveďte příslušné akce Then/Else.
- Pokud akce pravidla aktualizují pole nebo vlastnost, které používá předchozí pravidlo v seznamu (jedno s vyšší prioritou), přehodnotte toto předchozí pravidlo a podle potřeby proveďte příslušné akce. Všimněte si, že se znovu zhodnotují pouze pravidla s konkrétní závislostí.
- Pokračujte v procesu, dokud nebudou vyhodnocena všechna pravidla v sadě pravidel.
Podívejme se na jednoduchý příklad. Předpokládejme, že máte následující sadu pravidel, kde A, Batd., představují data pracovního postupu.
pravidlo 4 (priorita = 4)
IF A = 15
THEN B = 5
pravidla
IF C = 5
THEN B = 10
pravidla
IF D = 2
THEN A = 15
pravidlo1 (P=1)
IF B = 5
THEN E = 7
Předpokládejme, že máte následující vstupní data:
- A = 0
- B = 0
- C = 5
- D = 2
- E = 0
Vyhodnocení by pokračovalo takto:
- Pravidlo 4 se vyhodnocuje; vyhodnotí falsea protože nemá žádné akce Else, nejsou provedeny žádné akce.
- Pravidlo 3 se vyhodnotí jako true a provede se jeho akce, nastavení B = 10. Pravidlo 4 nezávisí na hodnotě B, takže vyhodnocení pokračuje do pravidla 2.
- Pravidlo 2 se vyhodnotí jako true a provede se jeho akce, nastavení A = 15.
- Vzhledem k tomu, že rule4 ve svých podmínkách používá hodnotu A, je znovu zhodnocená. Vyhodnotí se, že true a provede se jeho akce, nastavení B = 5; Pravidlo3 a Pravidlo2 se znovu nevyhodnotují, protože jejich podmínky nespoléhají na hodnotu A. Žádná předchozí pravidla nezávisí na hodnotě B, takže vyhodnocení pokračuje do pravidla 1.
- Pravidlo1 se vyhodnotí jako true a provede se jeho akce, nastavení E = 7.
Výsledná datová sada by teď byla:
- A = 15
- B = 5
- C = 5
- D = 2
- E = 7
Řetězení vpřed
Jak jsme viděli dříve, řetězení vychází z identifikovaných závislostí mezi pravidly; konkrétněji, závislosti mezi akcemi pravidla a podmínkami jiných pravidel. Tyto závislosti je možné identifikovat nebo deklarovat jedním ze tří způsobů:
- Implicitní
- Založené na atributech
- Explicitní
Implicitní
Modul automaticky identifikuje implicitní závislosti. Při prvním spuštění sady pravidel se každé pravidlo analyzuje, aby posoudilo pole a vlastnosti, které přečte v podmínce, a zapisuje do svých akcí. To se provádí procházením výrazu v podmínce a příkazy v akcích. Předpokládejme například následující pravidla.
pravidlo 1
IF this.subtotal > 10000
THEN this.discount = .05
pravidlo 2
IF this.discount > 0
THEN this.total = (1-this.discount) * this.subtotal
Modul vyhodnotí pravidla a určí, že pravidlo 1 přečte pole mezisoučtu a zapíše do pole slevy. Pravidlo 2 přečte pole slevy a mezisoučtu a zapíše do celkového pole. Proto pravidlo 2 má závislost na pravidlu 1; Výsledkem je, že modul zajistí, aby se pravidlo 2 vyhodnocoval nebo znovu vyhodnocoval při každém spuštění pravidla 1 jeho potom akci.
Všimněte si, že závislosti jsou identifikovány na úrovni uzlu typu list. Použijte následující sadu pravidel.
pravidlo 1
IF this.order.Subtotal > 10000
THEN this.order.Discount= .05
pravidlo 2
IF this.order.Discount > 0
THEN this.order.Total = (1-this.order.Discount) * this.order.Subtotal
pravidlo 3
IF this.order.CustomerType = "Residential"
THEN ...
Závislost by se stále identifikovala mezi pravidly 1 a 2. Pravidlo 3 by však nemělo závislost na pravidle 1 nebo 2, protože ani jedno z nich neaktualiuje vlastnost CustomerType. Jinými slovy, závislost je identifikována na úrovni CustomerType vlastnost, nikoli Order samotný objekt.
Prostřednictvím implicitního zřetězování WF provádí většinu nezbytných řetězení pro uživatele, takže uživatel nemusí explicitně modelovat aktualizace, a ve skutečnosti může být blahodně nevěděl o řetězení nebo potřebě, ve většině případů. Očekáváme, že modelování složitých sad pravidel bude pro většinu uživatelů jednodušší a zřetězení výkonné, ale většinou skryté schopnosti modulu. Pro složitější a specifické scénáře jsou však k dispozici dva další mechanismy pro zřetězování, založené na atributech a explicitní.
Attribute-Based
U volání metod v rámci pravidla je obtížnější deterministicky vyhodnotit čtení a zápisy, ke kterým dochází. Chcete-li tento problém vyřešit, WF poskytuje tři atributy, které lze použít na metodu označující jeho akce:
- RuleRead
- RuleWrite
- RuleInvoke
Přiřazení metody pomocí atributu RuleRead indikuje, že přečte uvedenou vlastnost. Podobně lze atribut RuleWrite použít k označení, že metoda aktualizuje dané pole nebo vlastnost. Předpokládejme, že naše první dvě pravidla v implicitní části byly přepsány následujícím kódem.
pravidlo 1
IF this.subtotal > 10000
THEN this.SetDiscount(.05)
pravidlo 2
IF this.discount > 0
THEN this.total = (1-this.discount) * this.subtotal
Metodu SetDiscount pak lze přiřadit následujícím způsobem, což by modulu umožnilo zjistit, že pravidlo 2 je závislé na pravidlu 1 kvůli použití pole slevy.
[RuleWrite("discount")]
void SetDiscount(double requestedDiscount)
{
...//some code that updates the discount field
}
Atribut RuleInvoke lze použít k diktování závislostí z důvodu volání propojené metody. Předpokládejme například následující úpravy pravidel a metod.
pravidlo 1
IF this.subtotal > 10000
THEN this.SetDiscountWrapper(.05)
pravidlo 2
IF this.discount > 0
THEN this.total = (1-this.discount) * this.subtotal
[RuleInvoke("SetDiscount")]
void SetDiscountWrapper(double requestedDiscount)
{
...
SetDiscount(requestedDiscount);
...
}
[RuleWrite("discount")]
void SetDiscount(double requestedDiscount)
{
}
Podmínka pravidla 2 volá SetDiscountWrapper, která při volání SetDiscount, která zapisuje do pole slevy. Atribut RuleInvoke umožňuje deklaraci a zjištění tohoto nepřímého zápisu modulem.
Je důležité si uvědomit, že pole nebo vlastnost odkazované v cestě atributu odkazuje na pole nebo vlastnost ve stejné třídě jako metoda, což není nutně kořenový objekt předaný do RuleSet ke spuštění. Můžete například přiřadit třídu Order následujícím způsobem.
public class Order
{
private double discount;
public double Discount
{
get { return discount;}
set { discount = value;}
}
[RuleWrite("Discount")]
void CalculateDiscount(double requestedDiscount, double weighting)
{
...//some code that updates the discount field
}
}
Pak můžete v pracovním postupu použít instanci této třídy následujícím způsobem.
public class Workflow1 : SequentialWorkflowActivity
{
private Order discount;
...
}
Provedení pravidla 2 pak způsobí opětovné hodnocení pravidla 1.
pravidlo 1
IF this.order.Discount > 5
THEN ...
pravidlo 2
IF ...
THEN this.order.CalculateDiscount( 5.0, .7)
Několik dalších bodů použití atributů:
- Atributy odkazují na pole/vlastnosti třídy Owner, nikoli parametry volání metody.
- Zástupné cardy lze použít také v atributech pravidla. Například RuleWrite("order/*") lze použít k označení, že všechna pole v objektu odkazovaném polem "order" jsou upravena metodou (v tomto příkladu by metoda byla v samotném pracovním postupu, ne Order class). Zástupný znak lze použít pouze na konci cesty; atribut, například RuleWrite("*/Discount") je neplatný.
- Atribut, například RuleWrite("order") lze použít s odkazovými typy k označení, že se odkaz změnil – například k označení, že proměnná teď odkazuje na jinou instanci Order. Všechna pravidla, která v proměnné používají pole nebo vlastnost, se kromě všech pravidel, která testují odkaz na instanci, budou předpokládat, že budou ovlivněna – například IF this.order == this.order2.
- Výchozí chování, pokud nejsou zadány žádné atributy metody je, že volání metody se předpokládá ke čtení všech polí/vlastností cílového objektu (objekt, na kterém je metoda vyvolána), ale zapisovat do žádné z nich. Kromě toho se předpokládá, že metoda čte z parametrů, které jsou předány do něj, ale předpokládá se, že nebude zapisovat do žádné z nich. parametry Out a ref se předpokládají, že se zapisují při použití v akcích pravidel.
Explicitní
Posledním mechanismem pro indikování závislostí polí a vlastností je použití příkazu Update. Příkaz Update přebírá jako svůj argument řetězec, který představuje cestu k poli nebo vlastnosti, nebo výraz, který představuje přístup k poli nebo vlastnosti. Do editoru RuleSet lze například zadat jeden z následujících dvou příkazů, který vytvoří příkaz Update pro vlastnost Name instance Customer v pracovním postupu.
Update("this/customer/Name")
NEBO
Update(this.customer.Name)
Příkaz Update označuje, že pravidlo zapisuje do uvedeného pole nebo vlastnosti. To by mělo stejný účinek jako přímá sada pole nebo vlastnosti v pravidle nebo volání metody s RuleWri te atribut pro pole nebo vlastnost.
Příkaz Update podporuje také použití zástupných znaků. Do pravidla můžete například přidat následující příkaz Update.
Update("this/customer/*")
To by způsobilo, že všechna pravidla, která používají libovolnou vlastnost v instanci Customer v jejich podmínkách, budou znovu zhodnocená. Jinými slovy, každá z následujících dvou pravidel by byla znovu zhodnocená.
IF this.customer.ZipCode == 98052
THEN ...
IF this.customer.CreditScore < 600
THEN ...
Obecně se neočekává, že uživatelé budou muset ve většině scénářů modelovat explicitní příkazy Update. Implicitní zřetězování by ve většině scénářů mělo poskytovat požadovanou analýzu závislostí a zřetězování chování. Přiřazení metody by mělo podporovat nejběžnější scénáře, ve kterých implicitní řetězení nedokáže identifikovat závislosti. Obecně platí, že přiřazení metody by bylo upřednostňovanou metodou pro indikování závislostí při použití příkazu Update, protože závislost může být identifikována jednou v metodě a využita v mnoha různých pravidlech, která tuto metodu používají. Také ve scénářích, ve kterých je zapisovač pravidel a implementátor metod různými jednotlivci (nebo práce se provádí v různých časech), metoda přiřazuje zapisující metodu – kdo zná nejlepší kód – k identifikaci závislostí metody.
Bude však existovat několik scénářů, ve kterých bude příkaz Update vhodným řešením, jako je například při předání pole nebo vlastnosti metodě ve třídě, kterou zapisovač pracovního postupu neřídí, a proto nemůže přiřazovat, jak je tomu v následujícím kódu.
IF ...
THEN this.customer.UpdateCreditScore(this.currentCreditScore)
Update(this.currentCreditScore)
Ovládací prvek pro řetězení vpřed
Řetězení vpřed je velmi výkonný pojem, který umožňuje, aby atomická pravidla byla sestavena do sad pravidel bez definice, nebo nutně i znalosti, závislostí mezi pravidly.
V některých scénářích ale může zapisovač pravidla chtít, aby poskytoval větší kontrolu nad chováním řetězení, konkrétně schopnost omezit řetězení, která se provádí. To modelátoru pravidel umožňuje:
- Omezte opakované provádění pravidel, které můžou poskytovat nesprávné výsledky.
- Zvýšení výkonu
- Zabraňte běhacím smyčkám.
Tato úroveň řízení se v pravidlech WF usnadňuje těmito dvěma vlastnostmi:
- Vlastnost Chaining Behavior v RuleSet.
- Vlastnost chování reevaluation u každého pravidla.
Obě tyto hodnoty lze nastavit v Editoru sady pravidel.
Vlastnost zřetězování chování
Vlastnost Chování řetězení v RuleSet má tři možné hodnoty:
- kompletní řetězení
- explicitní řetězení
- sekvenční
Možnost Full Chaining je výchozí a poskytuje chování popsané až do tohoto okamžiku. Možnost explicitního zřetězování vypne implicitní zřetězování a předepisuje, že řetězení by mělo proběhnout pouze pro explicitní příkazy Update. Díky tomu má zapisovač pravidla úplnou kontrolu nad tím, jaká pravidla způsobují přehodnocení. Obvykle by se to použilo k tomu, aby se zabránilo cyklickým závislostem, které způsobují nadměrné (nebo dokonce běhové) opakované spuštění pravidla, nebo aby se zvýšil výkon odstraněním nadbytečného přehodnocení pravidla, které není nutné k zajištění funkční úplnosti Sady pravidel.
Poslední možností je sekvenční. Tato možnost způsobí, že modul vyhodnotí pravidla přísně lineárním způsobem. Každé pravidlo by se vyhodnocovalo jen jednou a pouze jednou a v pořadí podle priority. Pravidla s vyšší prioritou můžou mít vliv na pravidla s nižšími prioritami, ale inverzní funkce by nebyla pravdivá, protože by nedošlo k žádnému řetězení. Tato možnost by se proto použila s explicitními přiřazeními priority, pokud mezi pravidly neexistovaly žádné závislosti.
Reevaluation Behavior – vlastnost
Chování reevaluation v pravidle má dvě možné hodnoty:
- Always
- nikdy
Vždy je výchozí a poskytuje dříve probírané chování, a to tím, že pravidlo bude vždy znovuhodnoceno na základě řetězení z důvodu akcí jiných pravidel. Nikdy, jak název napovídá, vypne toto přehodnocení. Pravidlo se vyhodnotí jednou, ale nebude znovu vyhodnoceno, pokud předtím provedlo nějaké akce. Jinými slovy, pokud bylo pravidlo dříve vyhodnoceno a následně provedeno jeho Pak nebo Else akce, nebude znovu vyhodnocen. Spuštění prázdné kolekce akcí v Pak nebo Else akce neoznačí pravidlo jako spuštěné.
Obvykle by se tato vlastnost používala na úrovni pravidla, aby se zabránilo nekonečné smyčce kvůli závislostem, které pravidlo obsahuje, a to buď na vlastních akcích, nebo v jiných pravidlech. Například následující pravidlo by vytvořilo vlastní nekonečnou smyčku a opětovné hodnocení není nutné ke splnění funkčních požadavků pravidla.
IF this.shippingCharge < 2.5 AND this.orderValue > 100
THEN this.shippingCharge = 0
Alternativně platí, že pokud je pravidlo znovu zhodnocené , ale jenom v případě, že se změní pole OrderValue, může uživatel nastavit chování řetězení v RuleSet tak, aby se řetězily pouze u explicitních příkazů Update (a pak tyto příkazy Update přidat do příslušných akcí pravidel). Uživatel by samozřejmě mohl k tomuto pravidlu přidat další predikát, který kontroluje, že hodnota ExpedičníCost ještě není 0, ale ovládací prvky řetězení odstraňují potřebu uživatelů definovat pravidla na základě podrobností vyhodnocení, a to na rozdíl od obchodních požadavků.
Funkce Halt
Jako konečný ovládací prvek lze funkci Zastavit přidat jako akci pravidla (jednoduše do pole akce Pak nebo Jinak v editoru zadejte "Zastavit". Tím se okamžitě zastaví spuštění RuleSet a vrátí řízení do volajícího kódu. Užitečnost této funkce není nutně omezena na scénáře zřetězování řídicích scénářů, samozřejmě. Sada pravidel s konkrétním funkčním cílem, například může po dosažení cíle použít funkci Zastavit ke spuštění zkratu.
Další diskuze o modelování
Spouštění na základě priority
Jak je uvedeno v předchozí části, pokud uživatelé chtějí pro sadu pravidel v této sadě pravidel nebo podmnožinu pravidel v této sadě pravidel, mohou tuto sekvenci přesně definovat pomocí pole priority v pravidle. Tím se často odebere požadavek na řetězení a uživatelé můžou řetězení dokonce vypnout v těchto scénářích. Zjistili jsme, že v mnoha případech lze závislosti pravidel splnit jednoduše poskytnutím explicitního pořadí provádění.
Je však důležité si uvědomit, že mechanismus předávání ve službě WF poskytuje uživatelům možnost definovat pořadí provádění, ale nevyžaduje je k tomu. Ve většině případů chování při řetězení dopředu není nutné přiřazovat priority pravidel ke správnému výsledku Sady pravidel, protože relace jsou automaticky spravovány modulem, aby se zajistilo splnění závislostí pravidel.
Použijte následující pravidla.
pravidlo 1
IF this.Weather.Temperature < 50
THEN this.Drink.Style = "Latte"
pravidlo 2
IF this.Drink.Style == "Latte"
THEN this.Snack.Style = "Scone"
ELSE this.Snack.Style = "Muffin"
Ve WF můžete zadat vyšší prioritu pravidla 1, aby se spustila jako první. Tím zajistíte, že Drink.Style nastavená před vyhodnocením pravidla 2.
K získání požadovaných výsledků se ale nevyžaduje sekvencování. Předpokládejme, že pravidlo 2 bylo vyhodnoceno jako první. V tomto případě může být Drink.Stylenull nebo může být jiný styl. To by vedlo k nastavení Snack.StyleMuffin. Po spuštění pravidla 1 a nastavení Drink.Style na Latte, pravidlo 2 bude znovuhodnocené a nastaví Snack.Style na Scone. Uživatel má v podstatě možnost diktování sekvencování, ale v mnoha případech to nemusí udělat.
Zpracování kolekce
V některých scénářích možná budete muset vyhodnotit pravidla pro všechny položky v kolekci jednotlivě. Iterace nad kolekcí se dá provádět mnoha způsoby, ale jedním ze způsobů je vzor pravidla, jako je tento:
pravidlo 1 (priorita = 2)
//always execute this rule once to create the enumerator
IF 1==1
THEN this.enumerator = this.myCollection.GetEnumerator()
pravidlo 2 (priorita = 1)
IF this.enumerator.MoveNext()
THEN this.currentInstance = this.enumerator.Current
pravidla 3-N (priorita = 0)
.... //additional rules written against this.currentInstance
pravidlo N+1 (priorita = -1)
// can be any condition as long as it is evaluated every time;
// this.currentInstance will be evaluated each time
//this.currentInstance changes, whereas
// "1==1" would only be evaluated once
IF this.currentInstance == this.currentInstance
THEN ...
Update("this/enumerator") //this will cause Rule 2 to be reevaluated
ELSE ...
Update("this/enumerator")
Sledování a trasování
Sledování
Při spuštění sady pravidel se události sledování odesílají do sledovacích služeb nakonfigurovaných na hostitelích, kteří se zaregistrovali pro tyto události, přidáním UserTrackPoint do profilu sledování. Odešle se RuleActionTrackingEvent, který poskytuje název pravidla, které bylo vyhodnoceno, a také výsledek vyhodnocení podmínky (true/false). Příklad najdete v ukázce RuleActionTrackingEvent v sadě SDK.
Výsledky vyhodnocení podmínek pravidel u aktivit je možné implicitně sledovat sledováním provádění aktivit.
Trasování
Další informace o vyhodnocení sady pravidel lze odeslat do souboru protokolu přidáním následujícího kódu do konfiguračního souboru aplikace.
<configuration>
<system.diagnostics>
<switches>
<add name="Rules" value="Information"/>
</switches>
</system.diagnostics>
</configuration>
Do souboru protokolu se odešlou následující informace:
- informace o závislostech podmínky :
- příklad : závislost podmínky ReturnNumberOfStops: this/currentFlight/OutboundFlight/NumberOfStops/.
-
informace o vedlejším efektu akce:
- příklad : pravidlo ReturnNumberOfStops PAK vedlejší efekt: "this/currentFlight/Score/"
- Relace řetězení :
- Příklad : pravidlo ReturnNumberOfStops pak aktivuje pravidlo "ApprovedFlights"
- spuštění sady pravidel :
- Příklad : pravidla: "Spouštění sady pravidel FlightRuleSet"
- vyhodnocení podmínky :
- Příklad : pravidla: Vyhodnocení podmínky pravidla SetDefaultScore
- výsledek vyhodnocení podmínky :
- Příklad : pravidla: Podmínka vyhodnocená jako True
-
provedení akce:
- Příklad : pravidla: Akce vyhodnocení a následné vyhodnocení pravidla SetDefaultScore
Všechny zprávy trasování jsou aktuálně definovány na úrovni Informace, takže byste měli zadat úroveň Informací nebo Podrobné v konfiguračním souboru, abyste viděli trasování pravidel.
Závěr
WF poskytuje flexibilní možnosti pravidel, které je možné využít mnoha různými způsoby pro podporu široké škály scénářů. Od jednoduchých podmínek aktivity až po sofistikované řetězení sad pravidel umožňuje technologie bezproblémově integrovat podporu pravidel do pracovních postupů. Kromě toho lze modul pravidel využít i mimo pracovní postupy k poskytování funkcí pravidel pro libovolnou aplikaci .NET.
Sada funkcí umožňuje novým vývojářům snadno začlenit jednoduchá pravidla do pracovních postupů a zároveň poskytuje bohatost a rozšiřitelnost pro podporu mnohem pokročilejších scénářů pravidel a aplikací. Tento dokument v kombinaci s prostředky, které jsou uvedeny v další části, by měl vývojářům pomoci s novými pravidly WF seznámit se s technologií a rychle se stát produktivním s použitím.
Další informace
webu pracovního postupu MSDN
Mnoho dokumentů a odkazů na webcasty a testovací prostředí
-
- externí sada nástrojů RuleSet– poskytuje příklad, jak externalizovat pravidla ze sestavení pracovních postupů.
- Analýza sady pravidel – nástroj pro analýzu sad pravidel pro vztahy mezi pravidly a daty.
- pravidla v Excelu– poskytuje příklad použití pravidel samostatně mimo pracovní postup. Ukazuje také, jak programově vytvořit pravidla, která jsou vytvořena prostřednictvím rozhodovací tabulky v Excelu.
Ukázky sady SDK
- IfElseWithRules– zobrazuje použití RuleCondition u aktivity IfElse (v části \Technologies\RulesAndConditions).
- DynamicUpdateChangingRules– ukazuje použití rozhraní API dynamické aktualizace ke změně RuleCondition na spuštěné instanci pracovního postupu (\Technologies\RulesAndConditions).
- SimplePolicy– ukazuje použití rozhraní API k definování jednoduché aktivity sady pravidel a zásad (\Technologies\Activities\Policy).
- AdvancedPolicy– definuje složitější sadu pravidel (\Technologies\Activities\Policy).
- RuleActionTrackingEventSample– ukazuje, jak zachytit výsledky vyhodnocení pravidel ve zprostředkovateli sledování (\Technologies\Tracking).
fórum pro pracovní postupy MSDN
- V případě dotazů souvisejících s pravidly WF nebo WF obecně navštivte toto diskuzní fórum.
o autorovi
Jurgen Willis je programový manažer v týmu Windows Workflow Foundation, který zodpovídá za technologie pravidel a aktivity řízené pravidly. Před připojením k Microsoftu navrhl a implementoval řešení integrace a řízení procesů pro společnosti Fortune 500.