Ciao Sto usando la biblioteca Simple Injector DI e hanno seguito un po 'di materiale veramente interessante di un modello architettonico progettato intorno al modello di comando:Calling comandi dal all'interno di un altro maniglia di comando() metodo
- Meanwhile... on the command side of my architecture
- Meanwhile... on the query side of my architecture
Il contenitore gestirà la durata del UnitOfWork
e sto utilizzando i comandi per eseguire funzioni specifiche nel database.
La mia domanda è se ho un comando, ad esempio un AddNewCustomerCommand
, che a sua volta esegue un'altra chiamata ad un altro servizio (cioè invia un messaggio di testo), dal punto di vista di design è questo accettabile o questo dovrebbe essere fatto in un più alto livello e se sì, come meglio farlo?
codice di esempio è qui sotto:
public class AddNewBusinessUnitHandler
: ICommandHandler<AddBusinessUnitCommand>
{
private IUnitOfWork uow;
private ICommandHandler<OtherServiceCommand> otherHandler;
AddNewBusinessUnitHandler(IUnitOfWork uow,
ICommandHandler<OtherServiceCommand> otherHandler)
{
this.uow = uow;
this.otherHandler = otherHandler;
}
public void Handle(AddBusinessUnitCommand command)
{
var businessUnit = new BusinessUnit()
{
Name = command.BusinessUnitName,
Address = command.BusinessUnitAddress
};
var otherCommand = new OtherServiceCommand()
{
welcomePostTo = command.BusinessUnitName
};
uow.BusinessUnitRepository.Add(businessUnit);
this.otherHandler.Handle(otherCommand);
}
}
Quindi, come si impedisce a un comando inviato da un gestore di comandi di eseguire quei deadlock o decoratori di transazioni? – GFoley83
È necessario impedire che i decoratori vengano applicati ai gestori nidificati (che in genere è davvero difficile da ottenere con qualsiasi contenitore DI) oppure lasciare che lo stesso decoratore rilevi che è già in esecuzione nel contesto di una transazione. Un'altra opzione è di dare ai gestori annidati la propria astrazione. Ciò rende banale applicare solo decoratori al gestore esterno. – Steven