12

現在、単純なテスト プロジェクトで Transaction Script パターン (Martin FowlerがCommand Patternを使用して説明した方法とまったく同じ) を実装しようとしています。すべて正常に動作します。問題は、指定したときに結果を取得する方法がわからないことですICommand インターフェイスから継承された具象クラスで実行されるメソッド。

私が持っている機能を明確にするために、いくつかのコードを示しましょう。ICommand インターフェイスから継承した単純な Cal​​culateSalaryCommand クラスがあります

public class CalculateSalaryCommand : ICommand
{
    private readonly CalculateSalaryTS _salaryTs;
    private readonly int _hour;
    private readonly int _salaryPerHour;

    public CalculateSalaryCommand(CalculateSalaryTS salaryTs, int hour, int salaryPerHour)
    {
        _salaryTs = salaryTs;
        _hour = hour;
        _salaryPerHour = salaryPerHour;
    }

    public void Execute()
    {
        _salaryTs.CalculateSalary(_hour, _salaryPerHour);
    }
}

および CalculateSalaryTS という名前の単純なトランザクション スクリプト クラス

public class CalculateSalaryTS {
    public void CalculateSalary(int _hour, int _salaryPerHour) {
        Result = _hour * _salaryPerHour;
    }
}

ご覧のとおり、具体的なコマンド クラスに のインスタンスを渡し、Execute メソッド内でそのインスタンスから操作を実行します。まあ、すべてがよさそうだ。しかし、整数でなければならない実行されたメソッドの結果を返すことができないという問題があります。この問題を処理するために、トランザクション スクリプト レイヤーにコードを追加することにしました。このコードは、各トランザクションがジェネリックITransactionResultインターフェイスから継承する必要があります。次のようになります。

public interface ITransactionResult<TResult>
{
    TResult Result { get; set; }
}

次に、CalculateSalaryTS クラスは次のようになりました。

public class CalculateSalaryTS : ITransactionResult<Int32> {

    public void CalculateSalary(int _hour, int _salaryPerHour) {
        Result = _hour * _salaryPerHour;
    }

    public int Result { get; set; }

}

使用法 :

    var script = new CalculateSalaryTS();
    var command = new CalculateSalaryCommand(script, 10, 20);           
    command.Execute();
    Console.WriteLine("Salary is {0}", script.Result);

この方法には独自の制限があることは承知していますが、この状況を処理するための別のアイデアを提供するまで、選択の余地はありません。

前もって感謝します。

4

2 に答える 2

27

コマンドの実行直後に結果を取得する必要がある場合は、結果をコマンド オブジェクトに格納できます。

public interface ICommandWithResult<T> : ICommand
{
  T Result { get; }
}

public class CalculateSalaryCommand : ICommandWithResult<int>
{
  public int Result { get; private set; }

  // ...

  public void Execute()
  {
    _salaryTs.CalculateSalary(_hour, _salaryPerHour);
    this.Result = _salaryTs.Result;
  }
}

// Usage:

var command = new CalculateSalaryCommand(new CalculateSalaryTS(), 10, 20);
command.Execute();
Console.WriteLine("Salary is {0}", command.Result);
于 2012-01-14T15:12:19.200 に答える
6

結果を返すことができるコマンドパターンを探していると思います。

それで、

    interface ICommand<TResult>
    {
       TResult Execute();
    }


public class CalculateSalaryCommand : ICommand<int>
{
    private readonly CalculateSalaryTS _salaryTs;
    private readonly int _hour;
    private readonly int _salaryPerHour;

    public CalculateSalaryCommand(CalculateSalaryTS salaryTs, int hour, int salaryPerHour)
    {
        _salaryTs = salaryTs;
        _hour = hour;
        _salaryPerHour = salaryPerHour;
    }

    public int Execute()
    {
        return _salaryTs.CalculateSalary(_hour, _salaryPerHour);
    }
}
于 2012-01-14T14:48:05.837 に答える