Sto cercando di implementare qualsiasi modello valido in un'applicazione web ( asp.net 4.6.1 WebForms, Legacy , C #).
Ho una grande classe ( code-behind
) con un evento Click enorme .
Voglio valutare eventuali condizioni ed eseguire i comandi (o azioni) e gestire gli errori per comunicare con l'interfaccia utente.
Non posso usare la transazione completa (i comandi-azioni coinvolgono modify ActiveDirectory, WCF WebServices calls, send emails and database updates
).
Ogni comando può fallire, è richiesta la gestione degli errori e le notifiche all'interfaccia utente. Questo è un po 'un trucco.
Ho l'impressione che gran parte della logica può e dovrebbe trovarsi in una classe logica aziendale (o multipla) , con la comunicazione tra l'interfaccia utente limitata a una classe parametro utilizzata per passare parametri dall'interfaccia utente al back-end, mentre un'altra classe restituisce i risultati (successo / errore) e vari messaggi.
Forse, sarebbe un altro buon modello migliore per gestire il flusso utilizzando più condizioni e comandi e gestione degli errori per comunicare con l'interfaccia utente .
codice (frammento) per l'evento clic (senza gestione degli errori)
if (ActionTypePage == ActionType.Modificacion || ActionTypePage == ActionType.MyDataM)
{
var password = DataPersonales.GenerarPassword();
var personalData= fillDataPersonales(password);
var userPortal = fillUserPortal();
var isEmployer = userPortal.IsEmployerRoleAorRoleB();
var existsInAD = ADOperations.ExistsUserInActiveDirectory(personalData.User);
if (userPortal.IsEnabled.Value && isEmployer)
{
// 1a) If RoleA, RoleB (employer) NOT exists in AD ==> Error
// 1b) If RoleA, RoleB (employer) exists in AD ==> Enable user in CRM (if false, Request New CRM)
if (!existsInAD)
{
var msg = String.Format("The employer {0:-10} no exists in ActiveDirectory", personalData.User);
var log = String.Format("User: {0, -15} - Error: {1:-100}", personalData.User, msg);
LoggerAD.Trace("[AdminDataUsers] - Update ERROR. ExistsUserInActiveDirectory. " + log);
((NsiMaster)Master.Master.Master).ShowNotification(msg, CommunicationType.Error, true);
return;
}
// Enable in CRM (if false, Request New CRM)
var okEnable = AdminManager.EnableUserEnCrm(personalData.User);
if (!okEnable)
{
var msg = "Cannot enable user in CRM. Please, do new Request CRM";
((NsiMaster)Master.Master.Master).ShowNotification(msg, CommunicationType.Error, true);
return;
}
}
if (userPortal.IsEnabled.Value && !isEmployer)
{
// 2a) If NOT RoleA, RoleB (not employeer) NOT exists in AD ==> Create in AD and Enable user in CRM (if false, Request New CRM)
if (!existsInAD)
{
var okToCreateInAD = (UserLogado.IsUserWithRoleMA() || UserLogado.IsEmployerRoleAorRoleB())
&& !userPortal.IsEmployerRoleAorRoleB();
var okAD = false;
if (okToCreateInAD)
{
var msgStateAD= "";
okAD = ADOperations.AddUserInActiveDirectory(personalData.User, personalData.Password,
personalData.Name, personalData.Surname + " " + personalData.Surname2
, personalData.FullName
, isEmployer, UserConsultado.UserSystemAire, UserConsultado.CustomValue
, personalData.Email, personalData.Telephone, personalData.Mobile
, out msgEstadoAD);
if (!okAD)
{
var log = String.Format("User: {0, -15} - Error: {1:-100}", personalData.User, msgEstadoAD);
LoggerAD.Trace("[AdminDataUsers] - Update ERROR. AddUserInActiveDirectory. " + log);
}
if (okAD)
{
var log = String.Format("User: {0, -15} - Password: {1:-10}", personalData.User, PassManager.ShowPassword(personalData.Password));
LoggerAD.Trace("[AdminDataUsers] - Update. AddUserInActiveDirectory. " + log);
}
}
// Enable in CRM (if false, Request New CRM)
var okEnable = AdminManager.EnableUserEnCrm(personalData.User);
if (!okEnable)
{
var msg = "Cannot enable user in CRM. Please, do new Request CRM";
((NsiMaster)Master.Master.Master).ShowNotification(msg, CommunicationType.Error, true);
return;
}
}
// 2b) If NOT RoleA, RoleB (not employeer) exists in AD ==> Send Warning (Email) and Enable in CRM (if false, Request New CRM)
if (existsInAD)
{
// Warning (Email)
AdminManager.SendEmailWarning(personalData.User);
// Enable in CRM (if false, Request New CRM)
var okEnable = AdminManager.EnableUserInCrm(personalData.User);
if (!okEnable)
{
var msg = "Cannot enable user in CRM. Please, do new Request CRM";
((NsiMaster)Master.Master.Master).ShowNotification(msg, CommunicationType.Error, true);
return;
}
}
}
// Disable
// 1a) If RoleA, RoleB (employer) NOT exists in AD ==> Error
// 1b) If RoleA, RoleB (employer) exists in AD ==> not Enable in CRM (Delete en CRM) and Delete License CRM
if (!userPortal.IsEnabled.Value && isEmployer)
{
if (!existsInAD)
{
var msg = String.Format("The employer {0:-10} not exists in ActiveDirectory", personalData.User);
var log = String.Format("User: {0, -15} - Error: {1:-100}", personalData.User, msg);
LoggerAD.Trace("[AdminDataUsers] - Update ERROR. ExistsUserInActiveDirectory. " + log);
((NsiMaster)Master.Master.Master).ShowNotification(msg, CommunicationType.Error, true);
return;
}
// Not Enable en CRM (Delete in CRM)
AdminManager.DisablesUserInCrm(personalData.User);
// Delete License CRM
AdminManager.DeleteUserCrmActive(personalData.User);
}
if (!userPortal.IsEnabled.Value && !isEmployer)
{
// 2a) If NOT RoleA, RoleB (not employeer) NOT exists in AD ==> Send Warning (Email) and Not Enable in CRM (Delete in CRM) - Delete License CRM
if (!existsInAD)
{
// Send Warning (Email)
AdminManager.SendEmailWarning(personalData.User);
// Not Enable en CRM (Delete in CRM)
AdminManager.DisablesUserInCrm(personalData.User);
// Delete License CRM
AdminManager.DeleteUserCrmActive(personalData.User);
}
// 2b) If NOT RoleA, RoleB (not employeer) exists in AD ==> Delete in AD and Not Enable in CRM (Delete in CRM) - Delete License CRM
if (!existsInAD)
{
// Delete in AD
var res = ADOperations.DeleteUserInActiveDirectory(personalData.User);
// Not Enable en CRM (Delete in CRM)
AdminManager.DisablesUserInCrm(personalData.User);
// Delete License CRM
AdminManager.DeleteUserCrmActive(personalData.User);
}
}
Qualche suggerimento per il refactoring, non l'odore del codice, magari anche con la gestione degli errori?