wcf - 多个KnowType命令 - 执行的正确模式

时间:2017-11-04 17:29:33

标签: c# wcf design-patterns

我有一个用于从客户端执行某些命令的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

有人可以提出更好的方法吗?

1 个答案:

答案 0 :(得分:0)

最后,我按照上面描述的方式实现了解决方案 - 它非常灵活且可扩展。 如果有任何改进建议 - 请欢迎。