Proces voor bedrijfsaankoop
In het voorbeeld PurchaseProcess ziet u hoe u een zeer eenvoudige aanvraag voor voorstellen (RFP) op basis van een aankoopproces maakt met automatische beste voorstelselectie. Het combineert Parallel, ParallelForEach<T>en ForEach<T> een aangepaste activiteit om een werkstroom te maken die het proces vertegenwoordigt.
Dit voorbeeld bevat een ASP.NET clienttoepassing die interactie met het proces mogelijk maakt als verschillende deelnemers (als de oorspronkelijke aanvrager of een bepaalde leverancier).
Demonstreert
Aangepaste activiteiten.
Samenstelling van activiteiten.
Bladwijzers.
Persistentie.
Geschematiseerde persistentie.
Tracering.
Bijhouden.
WF hosten in verschillende clients (ASP.NET webtoepassingen en WinForms-toepassingen).
Beschrijving van het proces
In dit voorbeeld ziet u een implementatie van een WF-programma (Windows Workflow Foundation) om voorstellen van leveranciers voor een algemeen bedrijf te verzamelen.
Een werknemer van bedrijf X maakt een aanvraag voor voorstel (RFP).
De werknemer typt de titel en beschrijving van de RFP.
De werknemer selecteert de leveranciers die ze willen uitnodigen om voorstellen in te dienen.
De werknemer dient het voorstel in.
Er wordt een exemplaar van de werkstroom gemaakt.
De werkstroom wacht tot alle leveranciers hun voorstellen indienen.
Nadat alle voorstellen zijn ontvangen, doorloopt de werkstroom alle ontvangen voorstellen en selecteert de beste.
Elke leverancier heeft een reputatie (in dit voorbeeld wordt de reputatielijst opgeslagen in VendorRepository.cs).
De totale waarde van het voorstel wordt bepaald door (De waarde die door de leverancier is getypt) * (de geregistreerde reputatie van de leverancier) / 100.
De oorspronkelijke aanvrager kan alle ingediende voorstellen zien. Het beste voorstel wordt gepresenteerd in een speciale sectie in het verslag.
Procesdefinitie
De kernlogica van het voorbeeld maakt gebruik van een ParallelForEach<T> activiteit die wacht op de aanbiedingen van elke leverancier (met behulp van een aangepaste activiteit waarmee een bladwijzer wordt gemaakt) en registreert het leveranciersvoorstel als een RFP (met behulp van een InvokeMethod activiteit).
Het voorbeeld doorloopt vervolgens alle ontvangen voorstellen die zijn opgeslagen in de RfpRepository
, het berekenen van de aangepaste waarde (met behulp van een Assign activiteit en System.Activities.Expressions activiteiten) en als de aangepaste waarde beter is dan de vorige beste aanbieding, wijst u de nieuwe waarde toe als de beste aanbieding (met behulp If van en Assign activiteiten).
Projecten in dit voorbeeld
Dit voorbeeld bevat de volgende projecten.
Project | Beschrijving |
---|---|
Gemeenschappelijk | De entiteitsobjecten die in het proces worden gebruikt (Aanvraag voor voorstel, leverancier en leveranciersvoorstel). |
WfDefinition | De definitie van het proces (als een WF-programma) en host (PurchaseProcessHost ) dat wordt gebruikt door clienttoepassingen voor het maken en gebruiken van exemplaren van de werkstroom voor het aankoopproces. |
Webclient | Een ASP.NET-clienttoepassing waarmee de gebruikers exemplaren van het aankoopproces kunnen maken en eraan kunnen deelnemen. Er wordt een aangepaste host gebruikt om te communiceren met de werkstroomengine. |
WinFormsClient | Een Windows Forms-clienttoepassing waarmee gebruikers exemplaren van het aankoopproces kunnen maken en eraan kunnen deelnemen. Er wordt een aangepaste host gebruikt om te communiceren met de werkstroomengine. |
WfDefinition
De volgende tabel bevat een beschrijving van de belangrijkste bestanden in het WfDefinition-project.
Bestand | Beschrijving |
---|---|
IPurchaseProcessHost.cs | Interface voor de host van de werkstroom. |
PurchaseProcessHost.cs | Implementatie van een host voor de werkstroom. De host abstraheert de details van de werkstroomruntime en wordt gebruikt in alle clienttoepassingen om werkstroomexemplaren te laden, uit te voeren en te PurchaseProcess gebruiken. |
PurchaseProcessWorkflow.cs | Een activiteit die de definitie van de werkstroom Aankoopproces bevat (afgeleid van Activity). Activiteiten die zijn afgeleid van Activity de functionaliteit opstellen door bestaande aangepaste activiteiten en activiteiten van de .NET Framework 4.6.1-activiteitenbibliotheek samen te voegen. Het samenstellen van deze activiteiten is de eenvoudigste manier om aangepaste functionaliteit te maken. |
WaitForVendorProposal.cs | Deze aangepaste activiteit is afgeleid van NativeActivity en maakt een benoemde bladwijzer die later door een leverancier moet worden hervat bij het indienen van het voorstel. Activiteiten die zijn afgeleid van NativeActivity, zoals activiteiten die zijn afgeleid van CodeActivity, maken imperatieve functionaliteit door te Executeoverschrijven, maar hebben ook toegang tot alle functionaliteit van de werkstroomruntime via de ActivityContext methode die wordt doorgegeven aan de Execute methode. Deze context biedt ondersteuning voor het plannen en annuleren van onderliggende activiteiten, het instellen van niet-persistente zones (uitvoeringsblokken waarbij de runtime de gegevens van de werkstroom niet persistent maakt, zoals binnen atomische transacties), en Bookmark objecten (ingangen voor het hervatten van onderbroken werkstromen). |
TrackingParticipant.cs | Een TrackingParticipant die alle traceringsevenementen ontvangt en opslaat in een tekstbestand. Deelnemers bijhouden worden toegevoegd aan het werkstroomexemplaren als extensies. |
XmlWorkflowInstanceStore.cs | Een aangepaste InstanceStore indeling waarmee werkstroomtoepassingen worden opgeslagen in XML-bestanden. |
XmlPersistenceParticipant.cs | Een aangepaste PersistenceParticipant instantie waarmee een aanvraag voor een voorstel naar een XML-bestand wordt opgeslagen. |
AsyncResult.cs/CompletedAsyncResult.cs | Helperklassen voor het implementeren van het asynchrone patroon in de persistentieonderdelen. |
Gemeenschappelijk
De volgende tabel bevat een beschrijving van de belangrijkste klassen in het algemene project.
Klas | Beschrijving |
---|---|
Vendor | Een leverancier die voorstellen indient in een aanvraag voor voorstellen. |
RequestForProposal | Een aanvraag voor voorstellen (RFP) is een uitnodiging voor leveranciers om voorstellen in te dienen voor een specifieke goederen of dienst. |
VendorProposal | Een voorstel van een leverancier aan een concrete RFP. |
VendorRepository | De opslagplaats van Leveranciers. Deze implementatie bevat een in-memory verzameling exemplaren van leveranciers en methoden voor het blootstellen van deze exemplaren. |
RfpRepository | De opslagplaats met aanvragen voor voorstellen. Deze implementatie bevat linq naar XML om een query uit te voeren op het XML-bestand met aanvragen voor voorstel dat wordt gegenereerd door de geschematiseerde persistentie. |
IOHelper | Deze klasse verwerkt alle I/O-gerelateerde problemen (mappen, paden enzovoort).) |
Webclient
De volgende tabel bevat een beschrijving van de belangrijkste webpagina's in het webclientproject.
Bestand | Beschrijving |
---|---|
CreateRfp.aspx | Hiermee maakt en verzendt u een nieuwe aanvraag voor voorstellen. |
Default.aspx | Toont alle actieve en voltooide aanvragen voor voorstellen. |
GetVendorProposal.aspx | Hiermee haalt u een voorstel van een leverancier op in een concrete aanvraag voor voorstellen. Deze pagina wordt alleen gebruikt door leveranciers. |
ShowRfp.aspx | Alle informatie over een aanvraag voor voorstellen weergeven (ontvangen voorstellen, datums, waarden en andere informatie). Deze pagina wordt alleen gebruikt door de maker van de aanvraag voor voorstel. |
WinForms Client
De volgende tabel bevat een beschrijving van de belangrijkste formulieren in het Win Forms-project.
Formulier | Beschrijving |
---|---|
NewRfp | Hiermee maakt en verzendt u een nieuwe aanvraag voor voorstellen. |
ShowProposals | Alle actieve en voltooide aanvragen voor voorstellen weergeven. Opmerking: Mogelijk moet u in de gebruikersinterface op de knop Vernieuwen klikken om wijzigingen in dat scherm te zien nadat u een aanvraag voor voorstel hebt gemaakt of gewijzigd. |
SubmitProposal | Haal een voorstel van een leverancier op in een concrete aanvraag voor voorstellen. Dit venster wordt alleen gebruikt door leveranciers. |
ViewRfp | Alle informatie over een aanvraag voor voorstellen weergeven (ontvangen voorstellen, datums, waarden en andere informatie). Dit venster wordt alleen gebruikt door de maker van de aanvraag voor voorstellen. |
Persistentiebestanden
In de volgende tabel ziet u de bestanden die zijn gegenereerd door de persistentieprovider (XmlPersistenceProvider
) zich in het pad van de tijdelijke map van het huidige systeem (met behulp van GetTempPath). Het traceringsbestand wordt gemaakt in het huidige uitvoeringspad.
Bestandsnaam | Beschrijving | Pad |
---|---|---|
rfps.xml | Het XML-bestand met alle actieve en voltooide aanvragen voor voorstellen. | GetTempPath |
[instanceid] | Dit bestand bevat alle informatie over een werkstroomexemplaren. Dit bestand wordt gegenereerd door de geschematiseerde persistentie-implementatie (PersistenceParticipant in XmlPersistenceProvider). |
GetTempPath |
[instanceId].tracking | Een tekstbestand met alle gebeurtenissen die zich in een concreet exemplaar hebben voorgedaan. Dit bestand wordt gegenereerd door TrackingParticipant. |
GetTempPath |
PurchaseProcess.Tracing.TraceLog.txt | Het traceringsbestand dat door de werkstroom wordt gegenereerd op basis van de configuratieparameters in de bestanden App.config of Web.config. | Huidig uitvoeringspad |
Dit voorbeeld gebruiken
Open met Visual Studio het PurchaseProcess.sln-oplossingsbestand.
Als u het webclientproject wilt uitvoeren, opent u Solution Explorer en klikt u met de rechtermuisknop op het webclientproject . Selecteer Instellen als opstartproject.
Als u het WinForms-clientproject wilt uitvoeren, opent u Solution Explorer en klikt u met de rechtermuisknop op het WinForms Client-project . Selecteer Instellen als opstartproject.
Druk op Ctrl+Shift+B om de oplossing te bouwen.
Druk op Ctrl+F5 om de oplossing uit te voeren.
Opties voor webclient
Maak een nieuwe RFP: Hiermee maakt u een nieuwe aanvraag voor voorstellen (RFP) en start u een werkstroom voor het aankoopproces.
Vernieuwen: Hiermee vernieuwt u de lijst met actieve en voltooide RFPs in het hoofdvenster.
Weergave: Toont de inhoud van een bestaande RFP. Leveranciers kunnen hun voorstellen indienen (indien uitgenodigd of de RFP is niet voltooid).
Weergeven als: De gebruiker heeft toegang tot het RFP met verschillende identiteiten door de gewenste deelnemer in de weergave als keuzelijst met invoervak in het actieve RFP-raster te selecteren.
WinForms-clientopties
Een RFP maken: hiermee maakt u een nieuwe aanvraag voor voorstellen (RFP) en start u een werkstroom voor het aankoopproces.
Vernieuwen: Hiermee vernieuwt u de lijst met actieve en voltooide RFPs in het hoofdvenster.
RFP weergeven: toont de inhoud van een bestaande RFP. Leveranciers kunnen hun voorstellen indienen (indien uitgenodigd of de RFP is niet voltooid)
Verbinding maken Als: De gebruiker heeft toegang tot het RFP met verschillende identiteiten door de gewenste deelnemer in de weergave als keuzelijst met invoervak in het actieve RFP-raster te selecteren.