在命令模式中获取已执行方法的结果
本文关键字:执行 方法 结果 获取 命令 模式 | 更新日期: 2023-09-27 18:20:29
目前我正试图在一个简单的测试项目中实现事务脚本模式(正如Martin Fowler使用命令模式所描述的那样),一切都很好,问题是当指定的方法在继承自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>
{
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);
我知道这种方式有其局限性,但在你给我另一个处理这种情况的想法之前,我别无选择。
提前谢谢。
如果您绝对需要在命令执行后立即获得结果,您可以将结果存储在命令对象中:
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);
我认为您正在寻找一种能够返回结果的命令模式。
所以,
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);
}
}