ハンドラーから生成されたデータをハンドラーに使用させたいという問題があります。
- UpdateUserProfileImageCommandHandlerAuthorizeDecorator
- UpdateUserProfileImageCommandHandlerUploadDecorator
- UpdateUserProfileImageCommandHandler
私の問題は、アーキテクチャとパフォーマンスの両方です。
UpdateUserCommandHandlerAuthorizeDecorator
リポジトリ (エンティティ フレームワーク) を呼び出して、ユーザーを承認します。エンティティを使用および変更し、チェーンに送信する必要がある、これに似た他のデコレータがあります。
UpdateUserCommandHandler
ユーザーをデータベースに保存するだけです。現在、別のリポジトリ呼び出しを行ってエンティティを更新する必要がありますが、以前のデコレータからエンティティを操作できた可能性があります。
私の問題は、コマンドがユーザー ID と更新するいくつかのプロパティのみを受け入れることです。Authorize デコレーターからユーザー エンティティを取得する場合、チェーンの上流でそのエンティティを処理するにはどうすればよいですか? 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();
}
}