I servizi di dominio dovrebbero sollevare eventi?

3

Ho un requisito aziendale che ogni account visualizzato deve essere registrato. Sto cercando di capire dove questo requisito dovrebbe essere nel mio codice. Questo è un evento di tipo query e non richiede di passare attraverso l'entità stessa come la maggior parte degli eventi del mio dominio.

Devo incapsulare tutti i miei repository in servizi di dominio che il servizio dell'applicazione chiamerà?

public class AccountService
{
    private readonly IAccountRepository repository;
    private readonly IDomainEventDispatcher dispatcher;

    public AccountService(IAccountRepository repository, IDomainEventDispatcher dispatcher)
    {
        this.repository = repository;
        this.dispatcher = dispatcher;
    }

    public Account ViewAccount(Guid Id)
    {
        var account = repository.GetById(Id);
        dispatcher.Raise(new AccountViewedEvent(account));
        return account;
    }
}

C'è un altro modo per gestirlo?

Sembra che molti livelli richiedano che un servizio applicativo chiami un servizio di dominio che chiama un repository.

    
posta Todd Skelton 26.03.2018 - 23:46
fonte

1 risposta

2

In genere i Servizi di dominio non decidono di generare eventi autonomamente - quella sorta di logica è normalmente riservata al modello di dominio stesso. Ad esempio, se modifichiamo leggermente l'esempio

public Account ViewAccount(Guid Id)
{
    var account = repository.GetById(Id);
    if (null != account) {
        dispatcher.Raise(new AccountViewedEvent(account));
    }
    return account;
}

puoi avere un senso per il fatto che è una decisione del modello che un evento è appropriato; il dispatcher sta semplicemente implementando la capacità.

It seems like a lot of layers to have an application service call a domain service that calls a repository.

Sì, sembra troppo elaborato.

Il modo giusto per andare dipende in realtà dalla motivazione del requisito. Qual è il valore commerciale delle viste di registrazione? Hai un modello il cui comportamento corretto dipende da valori precedentemente registrati ?

Se hai un registro "solo scrittura", allora gli eventi del dominio sono probabilmente eccessivi; come è il repository. Crea un'interfaccia per la capacità di registrazione al livello di astrazione corretto e collegala direttamente al framework di registrazione.

D'altra parte, se hai dei requisiti per fare cose interessanti con AccountViewedEvents dopo che sono stati registrati, allora probabilmente hai un modello implicito che dovrebbe essere trascinato alla luce e iniziare a fare domande come "questa parte del dominio stesso in cui vivono gli account o è qualcos'altro?"

I don't know about doing interesting things with the events, but it's to satisfy HIPAA requirements and extremely important. This is why I wanted to make it part of the domain

Questo è sicuramente qualcosa che vuoi rendere esplicito

public Account ViewAccount(Guid Id)
{
    var account = repository.GetById(Id);
    if (null != account) {
        hipaaCompliance.recordForAudit(new AccountViewedEvent(account));
    }
    return account;
}

Potresti anche voler progettare la tua API in modo tale da poter accedere all'Account solo tramite il modulo di conformità HIPAA.

    
risposta data 27.03.2018 - 16:20
fonte

Leggi altre domande sui tag