我有一个WCF服务用于执行客户端的一些命令。我有一个基类,AbstractCommand和一些定义具体命令的派生类。
WCF Web服务具有单个方法void Execute(AbstractCommand命令)。它可以通过[KnownType]属性接受具体命令(从AbstractCommand派生的类)。通过存储库对数据库执行命令。
为简化起见,假设命令在服务中执行,如下所示:
public void Excecute(AbstractCommand command) {
// Concrete command 1
var theCommand = command as ConcreteCommand1;
if (theCommand != null) {
var par1 = theCommand.Par1;
var par2 = theCommand.Par2;
...
_repository.DoSomething(par1, par2...);
return;
}
// Concrete command 2
var theCommand = command as ConcreteCommand2;
...
这个if-branching看起来有点可怕,我想重构它。我正在考虑这样的事情:AbstractCommand应该定义并且ConcreteCommands应该实现一个方法Execute,它将如下所示:
public class ConcreteCommand1 : AbstractCommand {
public int Par1 { get; set; }
public int Par2 { get; set; }
...
public void Execure(IRepository repository) {
repository.DoSomething(Par1, Par2...);
所以在服务中我不再需要那种令人讨厌的if-branching并且可以这样做:
public void Excecute(AbstractCommand command) {
command.Execure(_repository);
}
看起来很好。这种方法的唯一缺点是现在ConcreteCommand类而不仅仅是DTO(par1,par2 ...)需要在它们中定义逻辑(Execute方法)并且应该知道IRepository。
任何人都可以提出更好的方法吗?
最后,我按照上面描述的方式实现了解决方案 - 它非常灵活且可扩展。如果有任何改进建议 - 欢迎。