Schauen Sie sich das Ergebnis der ausgeführten Methode im Command-Muster

Derzeit bin ich versucht zu implementieren Transaction Script pattern (Genau wie Martin Fowler beschrieben mithilfe Befehl Muster) in einem simplen test-Projekt, alles funktioniert Prima, das problem ist, wo ich nicht weiß, wie man das Ergebnis(s), wenn die angegebene Methode ausgeführt, in der konkreten Klasse, die geerbt wird von ICommand-Schnittstelle.

Zeigen wir Ihnen einige code, um zu klären, welche Funktion ich habe.
Ich habe eine einfache CalculateSalaryCommand Klasse, die geerbt von ICommand-Schnittstelle

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);
    }
}

sowie eine einfache Transaktion Script-Klasse mit dem Namen CalculateSalaryTS

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

wie Sie sehen können, dass ich übergeben Sie die Instanz von konkrete command Klasse, dann in der Execute-Methode, die ich ausführen von Operationen, die Instanz. Gut, alles einfach nur gut Aussehen. aber es ist ein problem, das ich nicht zurückgeben können, das Ergebnis der ausgeführten Methode ist, sollte ein integer.
Um dieses problem zu umgehen, habe ich beschlossen, fügen Sie einige code, um die Transaktion Skript-Ebene, die jede Transaktion sollte das Erben von einer generischen ITransactionResult - Schnittstelle, die Aussehen wie die folgende:

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

Dann CalculateSalaryTS Klasse wurde wie diese :

public class CalculateSalaryTS : ITransactionResult<Int32> {

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

    public int Result { get; set; }

}

Verwendung :

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

Ich weiß, dieser Weg hat seine eigene Beschränkung, aber ich habe keine Wahl bis zu Ihnen gib mir eine andere Idee, um mit dieser situation umzugehen.

Vielen Dank im Voraus.

InformationsquelleAutor saber | 2012-01-14
Schreibe einen Kommentar