如果我有以下代码
[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
解析
对于如此冗长而感到抱歉,但我不记得所谓的技术。
答案 0 :(得分:2)
答案 1 :(得分:0)
我建议您查看Unity的策略注入/拦截方面。这允许您以非常轻量级和分离的方式进行装饰。这将是最简单的方法。
你实际上有一个调用处理程序,只要调用Execute方法就会执行它,它会记录到数据库,然后调用“真正的”类。
一般来看ICallHandler接口,HandlerAttribute和Interception扩展。
答案 2 :(得分:0)
这是我采用的解决方案。它需要一些调试,但似乎可以满足我当前的需求。
http://mrpmorris.blogspot.co.uk/2012/12/decorating-unity-extension.html