Domanda

Sto ancora imparando circa DDD e ho queste due domande (probabilmente semplici):

Se un fabbrica crea nuovo oggetto / grafico / istanze aggregati, ma anche "ricostituisce" oggetti / grafici da Repository , allora:

(1) Se le funzioni del livello di servizio / lavori / attività / unità-di-lavoro chiamata in fabbrica o di un metodo comportamentale sulla istanza di entità o una funzione DomainService? Mi sono perso per lo stack di chiamate in base alla responsabilità di questi componenti.

(2) casi Do entità hanno anche "metodi comportamentali" come sopra? Per esempio non un messaggio ha p.UpdatePost(string bodyText) o è che non è una preoccupazione del modello di dominio e quindi lo stesso dovrebbe essere raggiunto con il repository? O la funzione livello di servizio, dovrebbe essere chiamando il repository in questo caso e l'istanza di entità semplicemente metodi comportamentali che sono specifici per il dominio e non la persistenza? Ma allora, perché suona come "l'aggiornamento di un post" è una funzione di dominio quando questo è l'obiettivo del utente?

Si può vedere che sono in tutto il luogo. Si prega di aiuto.

È stato utile?

Soluzione

  

(1) Se le funzioni del livello di servizio / lavori / attività / unità-di-lavoro chiamata in fabbrica o di un metodo comportamentale sulla istanza di entità o una funzione DomainService? Mi sono perso per lo stack di chiamate in base alla responsabilità di questi componenti.

Solitamente - livello superiore recupera necessario radice aggregato e chiama una funzione su di esso. Talvolta livello superiore recupera molteplici radici di aggregazione e passarli al servizio di dominio, ma non spesso perché il servizio di dominio è piuttosto un segno forte che ci sia radice di aggregazione non riconosciuta. Alla fine - livello superiore garantisce radice aggregato si mantiene

.
  

(2) casi Do entità hanno anche "metodi comportamentali" come sopra? Per esempio fa un post ha p.UpdatePost (stringa bodyText) o è che non è una preoccupazione del modello di dominio e quindi lo stesso dovrebbe essere raggiunto con il repository? O la funzione livello di servizio, dovrebbe essere chiamando il repository in questo caso e l'istanza di entità semplicemente metodi comportamentali che sono specifici per il dominio e non la persistenza? Ma allora, perché suona come "l'aggiornamento di un post" è una funzione di dominio quando questo è l'obiettivo del utente?

Sì, lo fanno. modello di dominio dovrebbe essere a conoscenza del suo cambiamenti di stato. E questo è molto più vantaggioso come sembra in un primo momento. Cosa bella di questo è che si guadagna il punto di estensibilità. Se il cliente camminerà settimana più tardi a te e dire che vuole il sistema per controllare le cose supplementari quando gli aggiornamenti utente post - invece di cercare ogni riga di post.bodyText="new value", Sarete in grado di andare dritto al metodo post.UpdatePost e collegare le cose necessarie ci

D'altra parte - CRUD non si escludono a vicenda con il design del dominio driven. Per esempio. - nella mia domanda, la gestione degli utenti e dei loro ruoli è abbastanza interessante che non sto nemmeno cercando di modellarlo granulare. È necessario riconoscere parti ciò che conta nel mondo degli affari L'applicazione sta descrivendo e lavorare con.

Tieni presente che Domain Driven Design ha senso solo per applicazioni complesse. applicazione blog Semplice non ne ha bisogno.

  

(3) Mi sbaglio nel presumere che un livello di servizio (non Domain Services) dovrebbe incapsulare modo in cui un interagisce interfaccia con il livello di dominio?

Come la vedo io - servizi applicativi sono più per orchestrare le infrastrutture. Se non ci sono infrastrutture coinvolte - quindi di servizi applicativi perde valore :

  

I servizi delle applicazioni in fondo sono solo facciate. E ogni facciata è male se si aggiunge la complessità sovrappesate problemi ne risolva.


dominio Interno:

//aggregate root is persistence ignorant. 
//it shouldn't reference repository directly
public class Customer{
  public string Name {get; private set;}
  public static Customer Register(string name){
    return new Customer(name);
  }
  protected Customer(string name){
    //here it's aware of state changes.
    //aggregate root changes it's own state
    //instead of having state changed from outside
    //through public properties
    this.Name=name;
  }
}

//domain model contains abstraction of persistence
public interface ICustomerRepository{
  void Save(Customer customer);
}

Al di fuori del dominio:

public class CustomerRepository:ICustomerRepository{
  //here we actually save state of customer into database/cloud/xml/whatever
  public void Save(Customer customer){
    //note that we do not change state of customer, we just persist it here
    _voodoo.StoreItSomehow(customer);
  }
}

//asp.net mvc controller
public class CustomerController{
  public CustomerController(ICustomerRepository repository){
    if (repository==null)throw new ArgumentNullException();
    _repository=repository;
  }
  public ActionResult Register(string name){
    var customer=Customer.Register(name);
    _repository.Save(customer);
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top