Företagets köpprocess
Exemplet PurchaseProcess visar hur du skapar en mycket grundläggande anbudsförfrågan (RFP) med automatisk val av bästa förslag. Den kombinerar Parallel, ParallelForEach<T>och ForEach<T> och en anpassad aktivitet för att skapa ett arbetsflöde som representerar processen.
Det här exemplet innehåller ett ASP.NET klientprogram som gör det möjligt att interagera med processen som olika deltagare (som den ursprungliga beställaren eller en viss leverantör).
Demonstrationer
Anpassade aktiviteter.
Sammansättningen av aktiviteter.
Bokmärken.
Persistens
Schematiserad beständighet.
Spårning.
Spårning.
Värd för WF i olika klienter (ASP.NET webbprogram och WinForms-program).
Beskrivning av processen
Det här exemplet visar en implementering av ett WF-program (Windows Workflow Foundation) för att samla in förslag från leverantörer för ett allmänt företag.
En anställd på Företag X skapar en RFP (Request for Proposal).
Medarbetaren skriver i RFP-rubriken och beskrivningen.
Medarbetaren väljer de leverantörer som de vill bjuda in för att skicka förslag.
Medarbetaren skickar förslaget.
En instans av arbetsflödet skapas.
Arbetsflödet väntar på att alla leverantörer ska skicka in sina förslag.
När alla förslag har tagits emot itererar arbetsflödet genom alla mottagna förslag och väljer den bästa.
Varje leverantör har ett rykte (det här exemplet lagrar rykteslistan i VendorRepository.cs).
Det totala värdet för förslaget bestäms av (Värdet som anges av leverantören) * (leverantörens registrerade rykte) / 100.
Den ursprungliga beställaren kan se alla inlämnade förslag. Det bästa förslaget presenteras i ett särskilt avsnitt i rapporten.
Processdefinition
Kärnlogik i exemplet använder en ParallelForEach<T> aktivitet som väntar på erbjudandena från varje leverantör (med hjälp av en anpassad aktivitet som skapar ett bokmärke) och registrerar leverantörsförslaget som en RFP (med hjälp av en InvokeMethod aktivitet).
Exemplet itererar sedan genom alla mottagna förslag som lagras i RfpRepository
, beräknar det justerade värdet (med hjälp av en Assign aktivitet och System.Activities.Expressions aktiviteter), och om det justerade värdet är bättre än det tidigare bästa erbjudandet tilldelar det nya värdet som det bästa erbjudandet (användning If och Assign aktiviteter).
Projekt i det här exemplet
Det här exemplet innehåller följande projekt.
Projekt | beskrivning |
---|---|
Vanlig | Entitetsobjekten som används i processen (begäran om förslag, leverantör och leverantörsförslag). |
WfDefinition | Definitionen av processen (som ett WF-program) och värd (PurchaseProcessHost ) som används av klientprogram för att skapa och använda instanser av arbetsflödet för inköpsprocessen. |
Webclient | Ett ASP.NET klientprogram som gör att användarna kan skapa och delta i instanser av inköpsprocessen. Den använder en anpassad värd för att interagera med arbetsflödesmotorn. |
WinFormsClient | Ett Windows Forms-klientprogram som gör att användarna kan skapa och delta i instanser av inköpsprocessen. Den använder en anpassad värd för att interagera med arbetsflödesmotorn. |
WfDefinition
Följande tabell innehåller en beskrivning av de viktigaste filerna i WfDefinition-projektet.
Fil | beskrivning |
---|---|
IPurchaseProcessHost.cs | Gränssnitt för arbetsflödets värd. |
PurchaseProcessHost.cs | Implementering av en värd för arbetsflödet. Värden abstraherar information om arbetsflödeskörningen och används i alla klientprogram för att läsa in, köra och interagera med PurchaseProcess arbetsflödesinstanser. |
PurchaseProcessWorkflow.cs | En aktivitet som innehåller definitionen av arbetsflödet för inköpsprocessen (härleds från Activity). Aktiviteter som härleds från Activity att skapa funktioner genom att montera befintliga anpassade aktiviteter och aktiviteter från .NET Framework 4.6.1-aktivitetsbiblioteket. Att montera dessa aktiviteter är det mest grundläggande sättet att skapa anpassade funktioner. |
WaitForVendorProposal.cs | Den här anpassade aktiviteten härleds från NativeActivity och skapar ett namngivet bokmärke som måste återupptas senare av en leverantör när förslaget skickas. Aktiviteter som härleds från NativeActivity, som de som härleds från CodeActivity, skapar imperativa funktioner genom att Executeåsidosätta , men som också har åtkomst till alla funktioner i arbetsflödeskörningen ActivityContext via den som skickas till Execute metoden. Den här kontexten har stöd för att schemalägga och avbryta underordnade aktiviteter, konfigurera zoner utan kvarhållning (körningsblock där körningen inte bevarar arbetsflödets data, till exempel inom atomiska transaktioner) och Bookmark objekt (referenser för att återuppta pausade arbetsflöden). |
TrackingParticipant.cs | En TrackingParticipant som tar emot alla spårningshändelser och sparar dem i en textfil. Spårningsdeltagare läggs till i arbetsflödesinstansen som tillägg. |
XmlWorkflowInstanceStore.cs | En anpassad InstanceStore som sparar arbetsflödesprogram till XML-filer. |
XmlPersistenceParticipant.cs | En anpassad PersistenceParticipant som sparar en instans av begäran om förslag till en XML-fil. |
AsyncResult.cs/CompletedAsyncResult.cs | Hjälpklasser för att implementera det asynkrona mönstret i beständighetskomponenterna. |
Vanlig
Följande tabell innehåller en beskrivning av de viktigaste klasserna i Common-projektet.
Klass | beskrivning |
---|---|
Vendor | En leverantör som skickar förslag i en begäran om förslag. |
RequestForProposal | En begäran om förslag (RFP) är en inbjudan till leverantörer att lägga fram förslag på en specifik vara eller tjänst. |
VendorProposal | Ett förslag från en leverantör till en konkret RFP. |
VendorRepository | Lagringsplatsen för leverantörer. Den här implementeringen innehåller en minnesintern samling av instanser av leverantör och metoder för att exponera dessa instanser. |
RfpRepository | Lagringsplatsen för begäranden om förslag. Den här implementeringen innehåller använder Linq till XML för att köra frågor mot XML-filen med begäranden om förslag som genereras av schematiserad beständighet. |
IOHelper | Den här klassen hanterar alla I/O-relaterade problem (mappar, sökvägar och så vidare.) |
Webbklient
Följande tabell innehåller en beskrivning av de viktigaste webbsidorna i webbklientprojektet.
Fil | beskrivning |
---|---|
CreateRfp.aspx | Skapar och skickar en ny begäran om förslag. |
Default.aspx | Visar alla aktiva och slutförda begäranden om förslag. |
GetVendorProposal.aspx | Hämtar ett förslag från en leverantör i en konkret begäran om förslag. Den här sidan används endast av leverantörer. |
ShowRfp.aspx | Visa all information om en begäran om förslag (mottagna förslag, datum, värden och annan information). Den här sidan används endast av skaparen av begäran om förslag. |
WinForms-klient
Följande tabell innehåller en beskrivning av de viktigaste formulären i Win Forms-projektet.
Formulär | beskrivning |
---|---|
NewRfp | Skapar och skickar en ny begäran om förslag. |
ShowProposals | Visa alla aktiva och färdiga begäranden om förslag. Obs! Du kan behöva klicka på knappen Uppdatera i användargränssnittet för att se ändringar på den skärmen när du har skapat eller ändrat en begäran om förslag. |
SubmitProposal | Få ett förslag från en leverantör i en konkret begäran om förslag. Det här fönstret används endast av leverantörer. |
ViewRfp | Visa all information om en begäran om förslag (mottagna förslag, datum, värden och annan information). Det här fönstret används endast av skaparen av begäran om förslag. |
Beständighetsfiler
I följande tabell visas de filer som genereras av beständighetsprovidern (XmlPersistenceProvider
) i sökvägen till det aktuella systemets temporära mapp (med ).GetTempPath Spårningsfilen skapas i den aktuella körningssökvägen.
Filnamn | beskrivning | Sökväg |
---|---|---|
rfps.xml | XML-filen med alla aktiva och slutförda begäranden om förslag. | GetTempPath |
[instanceid] | Den här filen innehåller all information om en arbetsflödesinstans. Den här filen genereras av den schematiserade beständighetsimplementeringen (PersistenceParticipant i XmlPersistenceProvider). |
GetTempPath |
[instanceId].tracking | En textfil med alla händelser som inträffade i en konkret instans. Den här filen genereras av TrackingParticipant. |
GetTempPath |
PurchaseProcess.Tracing.TraceLog.txt | Spårningsfilen som genereras av arbetsflödet baserat på konfigurationsparametrarna i App.config- eller Web.config-filerna. | Aktuell körningssökväg |
Så här använder du det här exemplet
Öppna PurchaseProcess.sln lösningsfilen med Visual Studio.
Om du vill köra webbklientprojektet öppnar du Solution Explorer och högerklickar på webbklientprojektet . Välj Ange som startprojekt.
Om du vill köra WinForms-klientprojektet öppnar du Solution Explorer och högerklickar på WinForms-klientprojektet . Välj Ange som startprojekt.
Tryck på CTRL+SKIFT+B för att skapa lösningen.
Om du vill köra lösningen trycker du på CTRL+F5.
Alternativ för webbklient
Skapa en ny RFP: Skapar en ny begäran om förslag (RFP) och startar ett arbetsflöde för inköpsprocessen.
Uppdatering: Uppdaterar listan över aktiva och slutförda RFP:er i huvudfönstret.
Vy: Visar innehållet i en befintlig RFP. Leverantörer kan skicka in sina förslag (om de bjuds in eller om RFP inte är klar).
Visa som: Användaren kan komma åt RFP med hjälp av olika identiteter genom att välja önskad deltagare i kombinationsrutan Visa som i det aktiva RFP-rutnätet.
WinForms-klientalternativ
Skapa RFP: Skapar en ny begäran om förslag (RFP) och startar ett arbetsflöde för inköpsprocessen.
Uppdatering: Uppdaterar listan över aktiva och slutförda RFP:er i huvudfönstret.
Visa RFP: Visar innehållet i en befintlig RFP. Leverantörer kan skicka in sina förslag (om de bjuds in eller om RFP inte är klar)
Anslut Som: Användaren kan komma åt RFP med olika identiteter genom att välja önskad deltagare i kombinationsrutan Visa som i det aktiva RFP-rutnätet.