/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
/// <summary>
/// liste des ids des workflows
/// </summary>
ObservableCollection<Guid> _liste;
/// <summary>
/// la chaine de connexion de la base
/// </summary>
const string connectionString = "Server=.;Initial Catalog=FormationWF;Integrated Security=SSPI";
/// <summary>
/// le référentiel SQL Server
/// </summary>
private SqlWorkflowInstanceStore _store;
/// <summary>
/// indique si on est en démarrage
/// </summary>
private bool _demarrage;
/// <summary>
/// identité du workflow
/// </summary>
private WorkflowIdentity _identity = new WorkflowIdentity()
{
Name = "Workflow Embauche",
Version = new Version(1, 0, 0, 0)
};
/// <summary>
/// renvoie l'identité du workflow
/// </summary>
/// <returns></returns>
private WorkflowIdentity GetIdentity()
{
return _identity;
}
private void DesactiverBoutons()
{
ActiverBouton(btnOral, false);
ActiverBouton(btnTechnique, false);
}
private void ActiverBouton(Button bouton, bool valeur)
{
bouton.Dispatcher.BeginInvoke(new Action(() => bouton.IsEnabled = valeur));
}
public MainWindow()
{
InitializeComponent();
}
private void Grid_Loaded(object sender, RoutedEventArgs e)
{
Console.SetOut(new TextBoxTextWriter(txtConsole));
DesactiverBoutons();
// configurer le store
ConfigurerStore();
// charger les workflows en cours
ChargerListeWorkflows();
}
/// <summary>
/// charge la liste des workflows à partir de la base de données
/// </summary>
private void ChargerListeWorkflows()
{
using (var ctx = new FormationWFEntities())
{
_liste = new ObservableCollection<Guid>(ctx.InstancesTables.Select(et => et.Id).ToList());
}
cbWorkflows.ItemsSource = _liste;
}
/// <summary>
/// configure le store SQL Server
/// </summary>
private void ConfigurerStore()
{
// créer le référentiel en utilisant la chaine de connexion
_store = new SqlWorkflowInstanceStore(connectionString);
// déclarer les propriétés à intégrer avec la persistance
List<XName> variantProperties = new List<XName>();
variantProperties.Add(CandidatParticipant.nomns);
_store.Promote("Candidature", variantProperties, null);
// définir le référentiel par défaut
WorkflowApplication.CreateDefaultInstanceOwner(_store, null, WorkflowIdentityFilter.Any);
}
/// <summary>
/// configure l'application
/// </summary>
/// <param name="app"></param>
/// <param name="NomCandidat"></param>
private void ConfigurerApplication(WorkflowApplication app, string NomCandidat = null)
{
// affecter le store
app.InstanceStore = _store;
// ajouter l'extension pour pouvoir persister le dossier du candidat
app.Extensions.Add(new CandidatParticipant() { Nom = NomCandidat });
// évènement à déclencher lorsque le workflow est en mode veille
app.Idle = delegate(WorkflowApplicationIdleEventArgs args)
{
var signet = args.Bookmarks.FirstOrDefault();
if (signet == null)
return;
DesactiverBoutons();
switch (signet.BookmarkName)
{
case "EvaluationTechnique":
ActiverBouton(btnTechnique, true);
break;
case "EvaluationOrale":
ActiverBouton(btnOral, true);
break;
}
};
// évènement se déclenchant avant la persistance
app.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs args)
{
Console.WriteLine("Workflow {0} va être persisté", args.InstanceId);
return PersistableIdleAction.Unload;
};
// affiche un message lorsque le workflow est déchargé
app.Unloaded += delegate(WorkflowApplicationEventArgs args)
{
Console.WriteLine("Workflow {0} déchargé", args.InstanceId);
};
// se déclenche lorsque le workflow se termine
app.Completed += delegate(WorkflowApplicationCompletedEventArgs args)
{
var extensions = args.GetInstanceExtensions<CandidatParticipant>();
var dossier = extensions.First();
Console.WriteLine("Workflow {0} terminé avec statut {1}", args.InstanceId, args.CompletionState);
Console.WriteLine("L'opération d'embauche du dossier {0} a été terminée avec une moyenne de {1}", dossier.Nom, args.Outputs["moyenne"]);
DesactiverBoutons();
// supprimer le workflow de la liste
cbWorkflows.Dispatcher.Invoke(new Action(() => _liste.Remove(args.InstanceId)));
};
}
/// <summary>
/// démarrer une nouvelle candidature
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDemarrer_Click(object sender, RoutedEventArgs e)
{
// créer le workflow
var activity = new EmbaucheWorkflow();
// créer une nouvelle application
var _app = new WorkflowApplication(activity, GetIdentity());
// empêche de déclencher l'évènement de changement de combobox
_demarrage = true;
_liste.Add(_app.Id);
cbWorkflows.SelectedIndex = _liste.IndexOf(_app.Id);
_demarrage = false;
// configure l'application
ConfigurerApplication(_app, txtNom.Text);
// démarrer le workflow
_app.Run();
Console.WriteLine("Workflow {0} démarré", _app.Id);
}
private void btnTechnique_Click(object sender, RoutedEventArgs e)
{
// charger l'application
var app = ChargerApplication();
txtConsole.AppendText(string.Format("La commission technique a donné une note de {0}\n", cbEval.SelectedIndex + 1));
// déclencher le signet technique
app.ResumeBookmark("EvaluationTechnique", cbEval.SelectedIndex + 1);
}
private void btnOral_Click(object sender, RoutedEventArgs e)
{
var app = ChargerApplication();
txtConsole.AppendText(string.Format("La commission orale a donné une note de {0}\n", cbEval.SelectedIndex + 1));
app.ResumeBookmark("EvaluationOrale", cbEval.SelectedIndex + 1);
}
/// <summary>
/// changement de la combo box
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cbWorkflows_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
// si démarrage, ne rien faire
if (_demarrage || (cbWorkflows.SelectedItem == null))
return;
// charge l'application
var app = ChargerApplication();
Console.WriteLine("Workflow {0} chargé", app.Id);
// affiche les signets
foreach (var signet in app.GetBookmarks())
{
Console.WriteLine("Workflow {0}, signet {1} en attente", app.Id, signet.BookmarkName);
}
// exécute l'application,
app.Run();
}
/// <summary>
/// change le workflow persisté
/// </summary>
/// <returns></returns>
private WorkflowApplication ChargerApplication()
{
// récupérer l'instance à partir du store
var instance = WorkflowApplication.GetInstance((Guid)cbWorkflows.SelectedItem, _store);
// créer le workflow en mémoire
var activity = new EmbaucheWorkflow();
// créer l'application
var app = new WorkflowApplication(activity, instance.DefinitionIdentity);
ConfigurerApplication(app);
// chager le workflow
app.Load(instance);
return app;
}
}