В настоящее время я пытаюсь реализовать шаблон сценария транзакции (именно так, как Мартин Фаулер описал , используя Шаблон команд ) в простом тестовом проекте, все работает нормально. проблема в том, что я не знаю, как получить результат (ы), когда указанный метод выполняется в конкретном классе, который унаследован от интерфейса 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);
Я знаю, что у этого способа есть свои ограничения, но у меня нет выбора, пока вы не дадите мне другую идею, как справиться с этой ситуацией.
Заранее спасибо.