I detta exempel skall vi skapa ett flöde med kopplingar till affärslogik och som använder regelmotorn i WF för att avgöra hur flödet skall gå vidare.
1. Skapa ett nytt projekt i Visual Studio av typen Sequential Workflow Console Application.
2. Skapa en klass som heter Bestallning (Kan inte riktigt vänja mig vid tanken på att använda åäö i filnamn, klasser osv)
public class Bestallning
{
private int antal;
private float aPris;
private string artikelNamn;
public float Summa
{
get { return Antal * APris; }
}
public int Antal
{
get { return antal; }
set { antal = value; }
}
public float APris
{
get { return aPris; }
set { aPris = value; }
}
public string ArtikelNamn
{
get { return artikelNamn; }
set { artikelNamn = value; }
}
}
3. Skapa en klass som heter BestallningsTjanst
Denna klass har flera funktioner
- Agerar "affärslager"
- Lagrar våra pågående beställningar
- Håller vår workflowruntime
- Startar nya ärenden när en ny beställning registreras
- Lägg märke till att vi initierar BeställningsId som är en publik property i Workflow1
Som ni ser så genar vi rätt rejält här när det gäller vettig design men det är trots allt ett exempel ;-)
public class BestallningsTjanst
{
private static int idRaknare = 1;
private static Dictionary<int, Bestallning> bestallningar = new Dictionary<int, Bestallning>();
private readonly static WorkflowRuntime workflowRuntime;
static BestallningsTjanst()
{
workflowRuntime = new WorkflowRuntime();
workflowRuntime.StartRuntime();
}
private static int NyttId()
{
return idRaknare++;
}
public static void LaggBestallning(Bestallning bestallning)
{
int nyttId = NyttId();
lock (bestallningar)
{
bestallningar.Add(nyttId, bestallning);
}
Dictionary<string, object> parametrar = new Dictionary<string, object>();
parametrar.Add("BestallningsId", nyttId);
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(Workflow1), parametrar);
instance.Start();
}
public static Bestallning HamtaBestallning(int id)
{
return bestallningar[id];
}
}
4. Skapa flödet
Start, over, Under är kodaktiviteter som loggar till consolen, koden kommer nedan
KontrolleraSumma är en if-else aktivitet och bilden visar läget där vi skall editera vilkoret för aktivitetens ena ben.
Koden nedan innehåller några riktigt intressanta delar:
- Den publika propertien BestallningsId som intieras när ärendet startas
- Den privata propertien bestallning som ger flödet tillgång till den aktuella beställningen som läses upp från "affärslagret".
- Affärslagret hade naturligtvis kunnat vara en webbtjänst och utnyttjat exemelvis WCF.
public sealed partial class Workflow1: SequentialWorkflowActivity
{
private int bestallningsId = 0;
private Bestallning bestallning
{
get
{
return BestallningsTjanst.HamtaBestallning(BestallningsId);
}
}
public int BestallningsId
{
get { return bestallningsId; }
set { bestallningsId = value; }
}
public Workflow1()
{
InitializeComponent();
}
private void Start_ExecuteCode(object sender, EventArgs e)
{
Console.WriteLine(String.Format("Ärendet har startat för id {0} som berör {1}", BestallningsId, bestallning.ArtikelNamn));
}
private void Over_ExecuteCode(object sender, EventArgs e)
{
Console.WriteLine(String.Format("Ärende id {0} har en summa ({1}) som är over gränsvärdet", BestallningsId, bestallning.Summa));
}
private void Under_ExecuteCode(object sender, EventArgs e)
{
Console.WriteLine(String.Format("Ärende id {0} har en summa ({1}) som är under gränsvärdet", BestallningsId, bestallning.Summa));
}
}
6. Editera Over-grenen i if-else aktiviteten
7. Skapa villkoret
Här har vi tillgång till intellisense och de affärsregler som vi skapar här kan vi enkelt modifiera i framtiden. Många med mig upplever denna regelmotor som otroligt kraftfull. Lägg märke till hur enkelt vi kan komma åt avancerade affärsentiteter från vårt workflow.
8. Editera Program.cs
static void Main(string[] args)
{
Bestallning bestallning = new Bestallning();
bestallning.Antal = 5;
bestallning.APris = 5000;
bestallning.ArtikelNamn = "Laptop";
BestallningsTjanst.LaggBestallning(bestallning);
Console.ReadLine();
}
9. Kör
Som ni ser är det otroligt enkelt att komma igång och med hjälp av detta exempel kan ni själva bygga vidare och testa regler och kopplingar ut mot affärslager osv.