Utilizzando MS MVC e DDD, Come e dove definire una classe di parametri MVC metodo d'azione che coinvolge un soggetto, un oggetto di valore, e alcuni campi aggiuntivi?

StackOverflow https://stackoverflow.com/questions/1858199

Domanda

Sono solo sull'orlo di andare "Ah HA!" quando si tratta di codifica Domain Driven Design. La domanda è: Come e dove definire una classe di parametri MVC ActionMethod che coinvolge un soggetto, un oggetto di valore, e alcuni campi aggiuntivi? Le classi di oggetti di entità e il valore sono definiti nel mio repository.

Do I:

  1. Creare una classe personalizzata nel repository attuazione delle altre classi (per ottenere le proprietà di tutti in una singola classe), e aggiungere un paio di proprietà per i campi aggiuntivi?
  2. creare l'oggetto entità / valore classi Poco in un repository e creare una classe composita riferimento a questi oggetti nella mia classe di controllo, quindi utilizzare questo come il tipo di parametro ActionMethod?
  3. Qualcos'altro?

Il modulo di richiesta raccoglie semplicemente un paio di campi di classe cliente, un indirizzo postale, e un paio di specifiche di forma come come ci hanno trovato. Il contenuto non è importante, solo che contiene le informazioni da pocos multipla.

Lo so MVC abbinerà i campi del modulo inviato alle proprietà della Poco nel parametro ActionMethod simile al seguente:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult RequestCatalog()

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult RequestCatalog(Customer customer)

Quindi customer.firstName è destinata a firstName in forma pubblicato automaticamente.

Ho il seguente:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult RequestCatalog(string fname, string lname, string address,
    string city, string state, string zip, string phone, string howTheyFoundUs)

Ma vuole avere qualcosa di simile:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult RequestCatalog( RequestForm requestForm)

Qualche idea?

È stato utile?

Soluzione

Prima di tutto si deve rendersi conto che il modello di dominio deve essere definito indipendentemente dal quadro di run-time (MVC). Immaginate che in futuro si deve essere in grado di esporre il modello di dominio come un servizio WCF, o un rich client WPF / Silverlight, o un processo batch, o qualcosa d'altro ...

Questo significa che tutte modellazione deve essere non vincolati da dettagli tecnici. Come memorizzare i dati e le specifiche di come gli oggetti di dominio sono consumati devono essere (in gran parte) ignorato in questa fase del processo di progettazione.

Si deve sempre chiedersi: Questo senso di classe come parte del dominio puro

?

Nel caso specifico si, la maggior parte del vostro input suona come appartiene su una classe Customer con una struttura simile a questo

public class Customer
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Phone { get; set; }
    public Address Address { get; set; }
}

e la classe indirizzo viene definito in modo simile.

Ora la domanda è necessario porsi (o qualsiasi esperti del settore si sta lavorando): L'howTheyFoundUs appartengono alla classe Customer? O è è un concetto di dominio a sé stante? O è davvero solo un pezzo specifico per l'applicazione dei dati che non ha nulla a che fare con il modello di dominio a tutti? La risposta a queste domande vi guiderà come si finisce modellare il vostro input.

Per inciso, la proprietà del telefono sopra sembra dubbia a me, ma è un buon esempio di come i dettagli di implementazione (in questo caso ASP.NET MVC) possono perdere nel modello.

Un numero di telefono in realtà dovrebbe essere un oggetto di valore a sé stante (vedi questo post blog per un trattamento correlato di questo argomento), ma la ModelBinder predefinito di ASP.NET requres un tipo primite. Una soluzione migliore sarebbe quella di implementare un ModelBinder personalizzato in grado di analizzare un numero di telefono in un oggetto proprio.

Altri suggerimenti

Non c'è nulla che impedisca di utilizzare Request.Form nel metodo di azione.

per es.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult RequestCatalog(Customer customer)
{
    var howTheyFoundUs = Request.Form["howTheyFoundUs"];

    // ...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top