Получить результат выполненного метода в Command Pattern
В настоящее время я пытаюсь внедрить шаблон транзакции Script (точно, как описано в описании ) "rel=" noreferrer" > Command Pattern) в простом тестовом проекте, все просто отлично работает, проблема в том, что я не знаю, как получить результат (ы), когда указанный метод выполняется в конкретном классе, который унаследованный от интерфейса 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);
}
}
и простой класс транзакций Script с именем CalculateSalaryTS
public class CalculateSalaryTS {
public void CalculateSalary(int _hour, int _salaryPerHour) {
Result = _hour * _salaryPerHour;
}
}
как вы можете видеть, я передаю экземпляр конкретного класса команд, затем внутри метода Execute я выполняю операции из этого экземпляра. Ну, все просто хорошо выглядит. но есть проблема, я не могу вернуть результат выполненного метода, который должен быть целым числом.
Чтобы справиться с этой проблемой, я решил добавить некоторый код в слой Transaction Script, который каждая транзакция должна наследовать от общего интерфейса 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);
Я знаю, что этот способ имеет свои ограничения, но у меня нет выбора, пока вы не дадите мне еще одну идею, чтобы справиться с этой ситуацией.
Спасибо заранее.
Ответы
Ответ 1
Если вам абсолютно необходимо получить результат сразу после выполнения команды, вы можете сохранить результат в объекте команды:
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);
Ответ 2
Я думаю, что вы ищете шаблон команды, способный возвращать результат.
так,
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);
}
}