0

次のコードがある場合

[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

冗長で申し訳ありませんが、この手法が何と呼ばれているか思い出せません。

4

3 に答える 3

2

あなたが探しているのはDecorator Patternと呼ばれるものです。

Unityの使用に役立つ拡張機能があります。


アップデート

この解決策は、Jim Christopher による解決策よりも明確です。

于 2012-12-12T18:47:30.133 に答える
0

Unity のポリシー インジェクション / 傍受の側面を調べることをお勧めします。これにより、非常に軽量で分離された方法で装飾を行うことができます。これが最も簡単な方法です。

基本的に、Execute メソッドが呼び出されるたびに実行される呼び出しハンドラがあり、DB へのログ記録を行ってから「実際の」クラスを呼び出します。

一般に、ICallHandler インターフェイス、HandlerAttribute、および Interception 拡張機能を見てください。

于 2012-12-12T20:58:59.403 に答える
0

これが私が行った解決策です。少しデバッグが必要ですが、現在のニーズには問題なく機能しているようです。

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

于 2012-12-21T23:24:30.223 に答える