DDD query su domini

0

Questo è il mio primo tentativo di sviluppare un'applicazione utilizzando alcune delle idee alla base di DDD. È un'applicazione monolite di Rails (almeno per ora). So che non sono severo con DDD, ma sto cercando di concentrarmi sulla separazione dei miei domini che sembra il concetto più importante.

Penso che questa sia una domanda abbastanza rudimentale e sono sicuro che userò la terminologia DDD sbagliata, ma qui andiamo ...

Ho due domini:

  1. CRM (contatti, aziende, filiali, persone, ecc.)
  2. Citando (citazioni, quote, valuta, ecc.)

Nel dominio Quoting, il mio modello di preventivo si collega a un contact_id e company_id nel dominio CRM.

In una pagina del dominio CRM voglio elencare tutte le virgolette che appartengono a una società.

Il codice è qualcosa del tipo:

  module CRM
    class QuotesController
      def index 
        @company = Company.find params[:company_id]
        @quotes = Quoting::Quote.for_company(@company.id)
      end

In questa pagina voglio mostrare chi ha creato ogni preventivo e non sono sicuro di quale sia il modo migliore. La colonna contact_id nei collegamenti di citazione al CRM :: modello di contatto, e il CRM :: links modello a modello persona CRM :: che include il nome.

Senza pensare al DDD, avrei fatto qualcosa di simile (questo è semplificato) (sì, so che non sto usando le associazioni qui):

  module Quoting
    class Quote < ApplicationRecord
      belongs_to :company, class_name: "CRM::Company"
      belongs_to :contact, class_name: "CRM::Contact"

      class << self
        def for_company(company_id) 
          Quote.where(company_id: company_id)
               .includes(contact: :person)    <--- feels like it shouldn't be here
        end 
      end
    end 
  end

Nella vista:

@quotes.each do |quote|
  %tr  
    %td= quote.contact.person.name   (or quote.contact_name)

Il mio problema con questa è la riga .includes(contact: :person) che include la conoscenza di un altro dominio, cioè sa che il nome è all'interno del record personale. Se la mia implementazione interna di Contatti / Persone cambia, ovviamente anche questo dominio di quotazione fallirà.

Come è possibile farlo in uno stile più DDD?

Avrei un nuovo modello di Quote nel mio dominio CRM che eseguirà 2 query e le collocherai in un nuovo modello?

Grazie!

    
posta chris-richards 09.07.2018 - 13:17
fonte

1 risposta

2

Non sono un appassionato di query su domini in tempo reale perché può causare errori a catena. Se il dominio Quoting è disattivato e il dominio CRM necessita di informazioni su un preventivo, il dominio CRM può fallire senza alcun difetto. Immagina lo stesso scenario in cui il dominio Quoting non è inattivo ma solo lento: il dominio CRM riceve reclami da parte degli utenti perché sembra essere lento.

Il modo migliore per gestire questo è memorizzare nella cache le informazioni di supporto nei domini che ne hanno bisogno. Ad esempio, il dominio CRM potrebbe memorizzare solo QuoteID e Nome dal dominio Quoting. Tali cache sono soggette a dati obsoleti a meno che non si implementi anche un sistema di messaggistica che consenta al dominio di origine di comunicare a tutti gli ascoltatori che determinati dati sono stati modificati e che devono aggiornare le loro cache. Ogni volta che una citazione viene aggiunta o aggiornata, pubblica un messaggio per tutti gli abbonati con i dati attuali. Gli abbonati memorizzano nella cache solo i campi a cui tengono conto localmente e li utilizzano quando necessario.

Con l'approccio di cacheing, se il dominio Quoting è inattivo, il CRM può ancora funzionare. La funzione CRM è inoltre in grado di modificare la quantità di informazioni di quotatura memorizzate nella cache, senza modificare alcun requisito per il dominio CRM. Inoltre, si adatta bene in quanto il dominio Quoting non deve scalare solo per soddisfare le esigenze del dominio CRM inaspettatamente riuscito.

    
risposta data 10.07.2018 - 04:07
fonte

Leggi altre domande sui tag