Sto costruendo una piccola libreria riutilizzabile per due sistemi gestiti dalla nostra azienda.
Qualcosa su cui sono stato coinvolto è se dovrei esporre un set di proprietà di tipo Action<T>
per eventi come Completato, Interrotto, EccezioneOccurato, o se dovrei usare la metodologia Event<T>
T: EventArgs.
In pratica un'altra libreria interna consumerà queste informazioni e gestirà la visualizzazione delle informazioni all'utente. Le classi della libreria verranno istanziate all'interno di un singolo thread e non verranno utilizzate da elementi esterni al proprietario.
Per me sembra più sulla falsariga di se solo le notifiche debbano essere solo consumate da un oggetto, ma non importa, comunque per completezza, e perché io come biblioteca avere un controllo limitato su come un altro sviluppatore implementa questo, dovrei usare il metodo Event a causa della sua più ampia capacità di gestire gli eventi.
EDIT (codice di esempio):
@Robert Harvey, ho letto quel post durante la ricerca del ragionamento sul picking uno sull'altro. Capisco la risposta nel contesto di quella domanda, ma non sono sicuro di come si riferisce all'uso della parola chiave dell'evento o alla semplice assegnazione di una proprietà.
@Fabio Marcolini, capisco che sto usando la parola evento per descrivere cosa sta succedendo. Quello a cui sto cercando di rispondere è che se si utilizza la struttura degli eventi è preferibile semplicemente eseguire una proprietà delegata.
Ecco le proprietà che uso per definire le azioni dell'evento:
public Action<WorkflowInstallerCompletedEventArgs> InstallCompleted;
public Action<System.Activities.Activity, WorkflowInstallerActivityCompletedEventArgs> ActivityCompleted;
public Action<System.Activities.Activity, WorkflowApplicationAbortedEventArgs> InstallAborted;
public Func<System.Activities.Activity, WorkflowApplicationUnhandledExceptionEventArgs, UnhandledExceptionAction> UnhandledExceptionDuringInstall;
L'idea sarebbe quella di invocare uno di questi in questo modo:
if (this.InstallCompleted != null)
this.InstallCompleted(new WorkflowInstallerCompletedEventArgs(logs));
Ora fino al commento di @ svick avrei detto che si poteva avere solo un'azione (o Func) assegnata a ciascuna proprietà.
Implementazione di esempio:
WorkflowInstaller installer = new WorkflowInstaller(activity, new TestVariablesCollection()) { ActivitiesRunSequentially = true };
installer.AddInstallActivity(activity2);
installer.InstallCompleted = (e) =>
{
Log[] logs = e.Logs.ToArray();
string test = SerializationHelper<Log>.Serialize(logs.FirstOrDefault());
try
{
logOutputFromRun = SerializationHelper<Log[]>.Serialize(logs);
}
catch (Exception ex)
{
}
syncEvent.Set();
};
installer.InstallAborted = (a, e) =>
{
Assert.Fail("Unexpected abort during the install.");
syncEvent.Set();
};
installer.UnhandledExceptionDuringInstall = (a, e) =>
{
Assert.Fail("Unexpected exception during the install.");
syncEvent.Set();
return System.Activities.UnhandledExceptionAction.Terminate;
};
installer.StartInstallation();
syncEvent.WaitOne();
La risposta alla mia domanda potrebbe non essere definitiva in questo modo o in quel modo, ma più di best practice o approccio generalmente accettato. Sto davvero cercando di ampliare i miei orizzonti quando si tratta di creare codice che sia accettabile per un pubblico più ampio.