現在、単純なテスト プロジェクトで Transaction Script パターン (Martin FowlerがCommand Patternを使用して説明した方法とまったく同じ) を実装しようとしています。すべて正常に動作します。問題は、指定したときに結果を取得する方法がわからないことですICommand インターフェイスから継承された具象クラスで実行されるメソッド。
私が持っている機能を明確にするために、いくつかのコードを示しましょう。ICommand インターフェイスから継承した単純な CalculateSalaryCommand クラスがあります
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);
この方法には独自の制限があることは承知していますが、この状況を処理するための別のアイデアを提供するまで、選択の余地はありません。
前もって感謝します。