Giugno 2019

Volume 34 Numero 6

Il presente articolo è stato tradotto automaticamente.

[The Working Programmer]

Scrittura di codice Naked: azioni Naked

Dal Ted Neward | Giugno 2019

Ted NewardBentornato, NOFers. L'ultima volta esaminata la modalità di gestione delle raccolte, che offrono la possibilità di associare un numero di oggetti tra loro NakedObjects (msdn.com/magazine/mt833439). Come è verificato un errore tramite tale parte, tuttavia, introdotto il concetto di una "azione" nel codice senza effettivamente descriverlo in dettaglio. Poiché le azioni sono l'associazione ai dati"proprietà" "code", è opportuno esaminare le azioni in modo più dettagliato e notare in particolare, le posizioni in cui possono risiedere azioni e come vengono visualizzati nell'interfaccia utente.

Pronti ad agire naked?

Azioni

Il manuale NOF descrive un'azione come "un metodo che deve essere richiamato da un utente". È importante notare, tuttavia, che questi metodi non sono solo utente-richiamabili; il manuale espletata, nella stessa frase, sottolineare che "può essere richiamato anche a livello di codice all'interno di un altro metodo o un altro oggetto." Azioni, quindi, sono in cui è definito il comportamento di un oggetto e NOF genererà una voce di menu per l'utente fare clic su o richiamare per ogni azione rilevati.

Una tale azione che viene facilmente in mente è l'idea di eseguire i comportamenti CRUD di base su una determinata Talk (o un relatore, d'altra parte), ma è importante ricordare che NOF gestisce già come parte del comportamento del core dell'interfaccia utente nel suo complesso. Una voce di menu esterno al menu principale consente di creare una nuova voce, che, tenere presente che è definito in SpeakerRepository, come illustrato nel secondo articolo della serie (msdn.com/magazine/mt833268). Modifica di tale voce si verifica dopo che è selezionato un relatore e l'utente seleziona la voce di menu "Modifica" che viene visualizzato. In effetti, l'unica cosa non presenti nell'elenco è la possibilità di eliminare un relatore, in modo che è un semplice punto di partenza, ora aggiungerà un'azione che mi consente di eliminare il relatore attualmente visibile.

(È possibile sapere, è possibile sapere, ovvero chi potrebbe desiderare di eliminare un relatore? Siamo tutto così lovable, che è difficile immaginare che chiunque desiderare di rimuovere una voce dal sistema. Ma con l'utente corrente su questo, per scopi di didattica se nient'altro. Si supponga che disattiva. O qualcosa).

Per aggiungere una nuova azione, sufficiente aggiungere un nuovo metodo al tipo di voce. Per impostazione predefinita, qualsiasi metodo pubblico in un oggetto di dominio verrà esposta come un'azione nel menu "Azioni" dell'interfaccia utente, in modo che l'aggiunta di ciò è piuttosto semplice:

public void Delete()
{
  Container.DisposeInstance(this);
}

È importante ricordare che la proprietà contenitore è un'istanza di IDomainObjectContainer che viene inserito in ogni voce dopo che ha creato o restituiti dai SpeakerRepository dipendenza. Per rimuovere un oggetto persistente (ad esempio, un relatore aggiunto con l'azione CreateNewSpeaker sul SpeakerRepository), il contenitore deve "smaltire" quell'istanza.

Tuttavia, quando ciò è possibile aggiungere alla classe del relatore ed eseguirlo, si verifica un'operazione non valida, in particolare, dopo l'eliminazione della voce, viene visualizzato un errore relativo a un oggetto mancante. Il client NOF è che segnala che l'oggetto di dominio è stato semplice visualizzazione, ovvero il relatore semplicemente eliminato, ovvero non esiste più. Ciò rende molto pratica, quando si pensa e la risposta è assegnare qualcos'altro da visualizzare, ad esempio l'elenco di tutti i relatori rimanenti del sistema, che reperiscono abbastanza facilmente dal contenitore anche in questo caso l'interfaccia utente , come illustrato di seguito:

public IQueryable<Speaker> Delete()
{
  Container.DisposeInstance(this);
  return Container.Instances<Speaker>();
}

A questo punto, quando l'utente sceglie di eliminare un relatore, l'interfaccia utente che vengono rimosse, Mostra il resto dell'elenco di relatori e vita si sposta su. (Addio, relatore semplice. Si ricorda è si.)

Un problema che emerge, tuttavia, è che determinati oggetti di dominio presentano una dipendenza non crittografata da altri utenti all'interno del sistema e in modo arbitrario eliminazione definitiva di tali oggetti senza preoccuparsi di queste associazioni verrà semina chaos. (In effetti, NOF impedirà l'eliminazione di un oggetto che contiene tutti gli oggetti associati fino a quando tali oggetti associati vengono eliminati per primi.) In termini pratici, ciò significa che se chi parla qualsiasi illustra la creazione, l'eliminazione della voce lascerà quelli interventi isolati (orfani). È in teoria, non sarebbe consentire relatori che dispongono di uno o più conversazioni creati da eliminare. È possibile inserire un controllo all'interno del metodo Delete e fornire un messaggio di errore se viene selezionata dall'utente e non è possibile seguire, ma in genere è preferibile non consentire a un utente la possibilità di selezionare anche un elemento non sono autorizzati a eseguire operazioni, ovvero in termini di NOF , si desidera disabilitare completamente l'azione.

Ancora una volta, NOF Usa le convenzioni di denominazione per fornire questo tipo di funzionalità. Fornendo un metodo che inizia con il nome "Disabilita" e continua con il nome dell'azione che si desidera disabilitare (in questo caso "Delete"), è possibile eseguire tale verifica molto prima che l'utente seleziona mai:

public string DisableDelete()
{
  if (Talks.Count > 0)
  {
    return "Speakers cannot be deleted until their Talks are removed.";
  }
  return null;
}

Notare che fine esecuzione DisableDelete restituisce una stringa che sarà null se l'azione viene o verranno visualizzati all'utente. (Per impostazione predefinita, la voce di menu per l'azione verrà disabilitata, pertanto non sarà selezionabile dall'utente, ma tenere presente che le azioni possono essere richiamate in altri modi.)

Cosa accade se si desidera nascondere completamente l'azione da parte dell'utente? Che è un'altra domanda, ma NOF Usa lo stesso approccio, ovvero un metodo HideDelete, per indicare se l'azione deve essere visualizzato. La scelta tra nascosti e disabilitati è ovviamente una impercettibile e probabilmente un dibattito all'esperienza utente che altri utenti sono più completi di quanto non avrei; è sufficiente a dirsi, scegliere come finestra di progettazione dell'esperienza utente o il cuore visualizzata.

Parametri dell'azione

Tenere presente che, in molti casi, l'azione richiede dati aggiuntivi prima che possa essere eseguita. Un'azione può essere utile individuare tutti i relatori che dispongono di interventi che contengono un termine di ricerca specifico, ad esempio "Blockchain" o "IoT" (si spera per rimuoverli completamente dal sistema), ovvero l'utente deve avere la possibilità di digitare in tale termine di ricerca. Anche in questo caso, cui viene eseguito il commit all'entità che l'interfaccia utente deve essere compilato dalla struttura del codice stesso, pertanto in questo caso che l'interfaccia utente verrà esaminare i parametri del metodo e presentare un elemento dell'interfaccia utente che fornisce all'utente la possibilità di inserire l'input necessario in NOF sul posto. Si è visto questo meccanismo sul lavoro già fatto, in quanto il metodo FindSpeakerByLastName il SpeakerRepository esegue la stessa operazione: accetta un parametro di stringa per l'ultimo nome per il quale eseguire la ricerca, che interpreta NOF per indicare deve visualizzare una casella di testo in seguito viene richiamata l'azione.

Contributi naked

Si ricorderà da precedente articolo che ho accennato che tutto il mondo oggetti Naked è costituito da oggetti di dominio sia i servizi, in cui i servizi sono raccolte di comportamenti che non appartengano necessariamente dell'oggetto dominio. In pratica, se un metodo su un servizio accetta un oggetto di dominio come uno dei relativi parametri e tale parametro ha un attributo "ContributedAction" su di esso, la UI NOF accetta che può indicare che questa azione deve essere visualizzato nel menu dell'oggetto di dominio.

Per un momento si supponga il codice per inviare una notifica relatori che il discorso è stata accettata in occasione della conferenza di fuori dell'oggetto relatore. (In questo senso, in realtà, da un punto di vista, di modellazione perché avvisare un relatore effettivamente non ha nulla a che rappresenta un relatore del dominio.) Si crea un servizio, quindi, che ha un aspetto simile al seguente (prestando attenzione a verificare che sia registrato con NOF nella proprietà della classe NakedObjectsRunSettings, nonché servizi):

public class NotificationService
{
  public IDomainObjectContainer Container { set; protected get; }
  public void AcceptTalk([ContributedAction] Talk talk)
  {
    Container.InformUser("Great! The Speaker will be emailed right now");
  }
}

L'implementazione di notifica, naturalmente, richiederà più della semplice che visualizza un messaggio all'utente, ma che non è la parte importante, ovvero il punto chiave è l'attributo ContributedAction sul parametro Talk, che determina l'azione venga visualizzato nell'elenco parlare di azioni. Ciò offre una notevole flessibilità sulla quale codice viene visualizzato nel sistema, rispetto alla relativa posizione nell'interfaccia utente.

Si noti che è possibile contribuire azioni a gruppi di dominio, anche gli oggetti utilizzando lo stesso tipo della convenzione, applicarlo solo a un parametro che è una raccolta di oggetti di dominio anziché uno solo. Ad esempio, se vogliono inviare notifiche a un insieme di relatori, è possibile farlo da un metodo specifico, simile al seguente:

public void NotifySpeakers([ContributedAction] IQueryable<Speaker> speakers)
{
  foreach (Speaker s in speakers)
  {
    // Send SMS or email or whatever
  }
}

Dal punto di vista dell'interfaccia utente, l'eventuale raccolta di relatori avranno ora una casella di controllo vengono visualizzati prima di ciascuno di essi (consentendo all'utente di selezionare quale degli altoparlanti verranno visualizzati nella raccolta) e il menu "Azioni" elencato nella tabella avrà l'azione di "Notificare relatori" visualizzato. Come con tutte le azioni, se l'input aggiuntivi da parte dell'utente è richiesto (ad esempio il messaggio da inviare parlanti), questo sarà visualizzato come parte dell'interfaccia utente prima che venga eseguito il metodo.

Conclusioni

Azioni rappresentano un aspetto importante dell'esperienza di Naked oggetti Framework, che risultano in cui risiede la maggior parte delle "regole business" di qualsiasi applicazione. I servizi possono fornire le opportunità per la logica di business di host, per essere sicuri, ma si trova all'interno di azioni su un oggetto di dominio che gli sviluppatori basati su dominio individuerà le migliori opportunità per fornire il codice per "eseguire il lavoro".

Buona codifica!


Ted Newardè basato su Seattle polytechnology consulente, relatore e mentore. Ha scritto una considerevole quantità di articoli, creati e una dozzina libri ed legge tutto il mondo. Contattarlo all'indirizzo ted@tedneward.com o il suo blog blogs.tedneward.com.

Grazie al seguente esperto tecnico per la revisione dell'articolo: Richard Pawson


Discutere di questo articolo nel forum di MSDN Magazine