次のコードがある場合
[Serializable]
public abstract class ValidatedCommandArgs
{
}
public interface IValidatedCommand<T>
where T : ValidatedCommandArgs
{
IEnumerable<ValidationError> Execute(T args);
}
これで簡単な実装
public class CreateClientArgs : ValidatedCommandArgs
{
public string Code { get; set; }
public string Name { get; set; }
}
public class CreateClientCommand : IValidatedCommand<CreateClientArgs>
{
public IEnumerable<ValidationError> Execute(CreateClientArgs args)
{
throw new NotImplementedException();
}
}
次に、コマンド ハンドラーを登録します。
container.RegisterType<IValidatedCommand<CreateClientArgs>>, CreateClientCommand>();
今私ができるようにしたいのは、本質的にこれを行うことができるように、IValidatedCommand のすべての解像度をラップすることです
public class LoggedCommandHandler<T> : IValidatedCommand<T>
where T : ValidatedCommandArgs
{
readonly IValidatedCommand<T> Inner;
public LoggedCommandHandler(IValidatedCommand<T> inner)
{
this.Inner = inner;
}
IEnumerable<ValidationError> IValidatedCommand<T>.Execute(T args)
{
//Serialize ARGS
//Save Inner.GetType().ClassName + the serialized args to the DB
return Inner.Execute(args);
}
}
次に、解決するたびに(たとえば)IValidatedCommand<CreateClientArgs>
、実際にLoggedCommandHandler<CreateClientArgs>
解決されるインスタンスを取得しますinner = CreateClientCommand
冗長で申し訳ありませんが、この手法が何と呼ばれているか思い出せません。