我有一个用于从客户端执行某些命令的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 应该定义, ConcreteCommand 应该实现一个方法执行,如下所示:
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
有人可以提出更好的方法吗?
答案 0 :(得分:0)
最后,我按照上面描述的方式实现了解决方案 - 它非常灵活且可扩展。 如果有任何改进建议 - 请欢迎。