У меня есть вопрос, где я хотел бы мой обработчик, чтобы использовать данные, полученные из обработчиков:CommandHandler декораторы зависимость
- UpdateUserProfileImageCommandHandlerAuthorizeDecorator
- UpdateUserProfileImageCommandHandlerUploadDecorator
- UpdateUserProfileImageCommandHandler
Моя проблема в том, как архитектурный и производительность.
UpdateUserCommandHandlerAuthorizeDecorator
делает звонок в репозиторий (сущность) для авторизации пользователя. У меня есть другие декораторы, подобные этому, которые должны использовать и модифицировать объекты и отправлять их цепочке.
UpdateUserCommandHandler
должен просто сохранить пользователя в базе данных. В настоящее время я должен сделать другой вызов репозитория и обновить объект, пока я мог бы работать с сущностью из предыдущего декоратора.
Моя проблема заключается в том, что команда принимает только идентификатор пользователя и некоторые свойства для обновления. В случае, когда я получаю пользовательский объект от Authorize decorator, как я могу по-прежнему работать над этой сущностью в цепочке? Можно ли добавить это свойство User
к команде и работать над этим?
Код:
public class UpdateUserProfileImageCommand : Command
{
public UpdateUserProfileImageCommand(Guid id, Stream image)
{
this.Id = id;
this.Image = image;
}
public Stream Image { get; set; }
public Uri ImageUri { get; set; }
}
public class UpdateUserProfileImageCommandHandlerAuthorizeDecorator : ICommandHandler<UpdateUserProfileImageCommand>
{
public void Handle(UpdateUserProfileImageCommand command)
{
// I would like to use this entity in `UpdateUserProfileImageCommandHandlerUploadDecorator`
var user = userRespository.Find(u => u.UserId == command.Id);
if(userCanModify(user, currentPrincipal))
{
decoratedHandler(command);
}
}
}
public class UpdateUserProfileImageCommandHandlerUploadDecorator : ICommandHandler<UpdateUserProfileImageCommand>
{
public void Handle(UpdateUserProfileImageCommand command)
{
// Instead of asking for this from the repository again, I'd like to reuse the entity from the previous decorator
var user = userRespository.Find(u => u.UserId == command.Id);
fileService.DeleteFile(user.ProfileImageUri);
var command.ImageUri = fileService.Upload(generatedUri, command.Image);
decoratedHandler(command);
}
}
public class UpdateUserProfileImageCommandHandler : ICommandHandler<UpdateUserProfileImageCommand>
{
public void Handle(UpdateUserProfileImageCommand command)
{
// Again I'm asking for the user...
var user = userRespository.Find(u => u.UserId == command.Id);
user.ProfileImageUri = command.ImageUri;
// I actually have this in a PostCommit Decorator.
unitOfWork.Save();
}
}
Вы можете использовать «по цепочке» дважды в вашем вопросе. Что ты имеешь в виду? – Steven
@Steven, я считаю декораторы чем-то вроде цепочки, 1 декоратор вызывает другого, переходя к фактическому обработчику команд. Поэтому мне бы хотелось, чтобы данные передавались от одного декоратора к другому до обработчика –
Не могли бы вы обновить свой вопрос и привести пример того, что вы делаете? – Steven