Получить результат выполненного метода в шаблоне команд

В настоящее время я пытаюсь реализовать шаблон сценария транзакции (именно так, как Мартин Фаулер описал , используя Шаблон команд ) в простом тестовом проекте, все работает нормально. проблема в том, что я не знаю, как получить результат (ы), когда указанный метод выполняется в конкретном классе, который унаследован от интерфейса ICommand.

Давайте покажем вам код, чтобы прояснить, какие функции у меня есть. У меня есть простой класс CalculateSalaryCommand, унаследованный от интерфейса ICommand

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 Result { get; set; }
}

Затем класс CalculateSalaryTS стал таким:

public class CalculateSalaryTS : ITransactionResult {

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

Я знаю, что у этого способа есть свои ограничения, но у меня нет выбора, пока вы не дадите мне другую идею, как справиться с этой ситуацией.

Заранее спасибо.

11
задан Stelios Adamantidis 24 September 2019 в 15:37
поделиться