包装已解析的实例 - Unity依赖注入

时间:2012-12-12 15:47:02

标签: dependency-injection unity-container

如果我有以下代码

[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解析

对于如此冗长而感到抱歉,但我不记得所谓的技术。

3 个答案:

答案 0 :(得分:2)

您要找的是Decorator Pattern

有一个extension for Unity可以帮助您使用它。


<强>更新

This solution比吉姆克里斯托弗更明确。

答案 1 :(得分:0)

我建议您查看Unity的策略注入/拦截方面。这允许您以非常轻量级和分离的方式进行装饰。这将是最简单的方法。

你实际上有一个调用处理程序,只要调用Execute方法就会执行它,它会记录到数据库,然后调用“真正的”类。

一般来看ICallHandler接口,HandlerAttribute和Interception扩展。

答案 2 :(得分:0)

这是我采用的解决方案。它需要一些调试,但似乎可以满足我当前的需求。

http://mrpmorris.blogspot.co.uk/2012/12/decorating-unity-extension.html