Hola estoy usando la biblioteca Simple Injector DI y han estado siguiendo algún material realmente interesante de un modelo arquitectónico diseñado en torno al patrón de comando:Calling comandos desde dentro de otro método de la manija de mando()
- Meanwhile... on the command side of my architecture
- Meanwhile... on the query side of my architecture
El contenedor administrará la vida útil del UnitOfWork
, y estoy usando comandos para realizar funciones específicas en la base de datos.
Mi pregunta es si tengo un comando, por ejemplo un AddNewCustomerCommand
, que a su vez realiza otra llamada a otro servicio (es decir, envía un mensaje de texto), desde un punto de vista de diseño es aceptable o debe hacerse a una mayor nivel y, de ser así, ¿cuál es la mejor manera de hacerlo?
Ejemplo de código es el siguiente:
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);
}
}
Entonces, ¿cómo evitar que un comando enviado por un controlador de comando ejecute esos decoradores de punto muerto o de transacción? – GFoley83
Deberá evitar que los decoradores se apliquen a los manejadores anidados (lo cual es realmente difícil de lograr con cualquier contenedor DI), o dejar que el decorador detecte que ya se ejecuta en el contexto de una transacción. Otra opción es dar a los manejadores anidados su propia abstracción. Esto hace que sea trivial aplicar decoradores solo al controlador externo. – Steven