7

Ho studiato architettura della cipolla per un paio di giorni. Capisco che le dipendenze dovrebbero sempre andare verso il centro e come usare l'iniezione di dipendenza per raggiungere questo obiettivo. Ma ho un paio di domande che ancora non riesco a capire.come implementare servizi e repository sull'architettura cipolla?

  1. Un modello (o entità) può fare riferimento a un'interfaccia di repository oa un'interfaccia di servizio?

    Esempio: un'entità Order ha un rapporto DeliveryCity stabilita attraverso Oder.DeliveryZip proprietà, che è non una chiave esterna, ma è unico. Per ottenere il City per una chiusura lampo, devo chiamare ICityRepository.FindByZip(zip)

    Ho il seguente codice nel mio modello

    class Order 
    { 
        . . . 
    
        [Inject] 
        public ICityRepository CityRepository { get; set; } 
    
        private City _dCity; 
    
        public City DeliveryCity { 
         get { 
          if (_dCity == null) 
           _dCity = this.CityRepository.FindByZip(this.DeliveryZip); 
    
          return _dCity; 
         } 
        } 
        . . . 
    } 
    
  2. Quali sarebbero i problemi del codice di cui sopra? Dovrebbe invece usare un servizio di dominio?

  3. Le implementazioni dei servizi di dominio devono essere definite all'interno del core o del livello infrastruttura?

risposta

5

Questo è dove le fabbriche rientrano nel dominio. Un OrderFactory può assumere dipendenze, come una dipendenza da IOrderRepository e una dipendenza da ICityRepository. Quando la fabbrica viene utilizzata per creare (o ricostituire) un'entità Ordine, la fabbrica può cercare la Città e impostare la proprietà Ordine di conseguenza. Oppure, come suggerisce herzmeister, impostalo su Lazy in modo che la ricerca venga eseguita solo se necessario.

+0

Ha perfettamente senso! Mi sto chiedendo "come potrei perdere questo?"! Grazie! – svallory

+1

Questo è un errore. La fabbrica DDD non è responsabile per la ricostituzione. La riconsiderazione è la vita media di un oggetto, la fabbrica si occupa solo dell'inizio della vita. Si prega di vedere questa risposta: http://stackoverflow.com/a/10264669/625332 – Dmitry

+0

Non sono d'accordo. Le fabbriche sono utilizzate per creare istanze di un oggetto. Possono essere all'inizio del ciclo di vita di un oggetto o utilizzati per la ricostituzione. Possono essere della stessa classe con due metodi o due classi diverse. Ad ogni modo, sono d'accordo sul fatto che ci sia una differenza nel modo in cui la fabbrica si comporta in ogni caso. Di solito ho lo stabilimento di ricostituzione come dipendenza del repository che delega alla fabbrica per creare e ricostituire la nuova istanza con i dati recuperati dall'archivio dati. Per ulteriori informazioni, vedere Evans pg 145: "Ricostituzione di oggetti memorizzati" – SonOfPirate

5

Quali sarebbero i problemi del codice di cui sopra? Dovrebbe invece usare un servizio di dominio?

Due cose da considerare qui:

  1. ICityRepository non è una vera e propria dipendenza per Ordine, in altre parole Order non ne ha bisogno per i suoi altri metodi. La vera dipendenza è qualcosa a cui l'oggetto non può lavorare senza. Quindi potresti considerare di passarlo come parametro al metodo come 'GetDeliveryCity' (vedi this per i dettagli).

  2. Trovare la città per codice postale non sembra una responsabilità dell'ordine. Perché l'ordine sia cohesive, deve gestire solo la funzionalità relativa agli ordini. Potresti voler prendere questa funzionalità fuori dalla classe dell'ordine.

Se le implementazioni di Servizi di dominio essere definito all'interno del nucleo o al livello di infrastruttura?

All'interno del core se questo è veramente servizio di dominio (non servizio applicativo).

0
  1. Come su

    private Lazy<City> _dCityLazy; 
    
    public City DeliveryCity { 
        get { 
         return _dCityLazy.Value; 
        } 
    } 
    

    in cui ci si inietta il Lazy<City> da un qualche meccanismo?

  2. Deciderete in modo flessibile per iniezione dall'esterno, in questo esempio.

  3. Direi che dipende in realtà da un particolare servizio di dominio e da dove viene utilizzato.

+0

Iniettare la città attraverso un IoC porterebbe ad aggiungere regole di business all'iniettore delle dipendenze, il che è molto grave. Non sono sicuro che sia quello che hai proposto tu. – svallory

+0

ovviamente le regole aziendali nell'iniettore delle dipendenze sono davvero pessime, ma non deve essere così. Ci sono molte altre possibilità. Ci può essere un servizio di dominio in mezzo. Oppure, le semplici ricerche di id sono ovviamente il lavoro di un repository, che trasporta il metodo effettivo da cui verrà fatto riferimento al delegato per il 'Lazy '. In generale, mi piace semplicemente mantenere le mie entità semplici, cioè senza alcuna conoscenza della struttura della persistenza effettiva, cioè senza riferimenti a servizi o repository. – herzmeister