【发布时间】:2017-11-04 17:29:33
【问题描述】:
我有一个 WCF 服务用于执行来自客户端的一些命令。 我有一个基类 AbstractCommand 和许多定义具体命令的派生类。
WCF Web 服务只有一个方法void Execute(AbstractCommand command)。它可以通过 [KnownType] 属性接受具体命令(从 AbstractCommand 派生的类)。这些命令通过 Repository 对数据库执行。
为了简化,假设命令在服务中执行,如下所示:
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 分支看起来有点吓人,我想重构它。 我正在考虑这样的事情: AbstractCommand 应该定义并且 ConcreteCommand 应该实现一个方法 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 分支,并且可以这样做:
public void Excecute(AbstractCommand command) {
command.Execure(_repository);
}
看起来不错。这种方法的唯一缺点是现在 ConcreteCommand 类而不只是 DTO(par1,par2...)需要在其中定义逻辑(Execute 方法)并且应该注意 IRepository。
有人可以提出更好的方法吗?
【问题讨论】:
-
我认为您的方法很有意义,并且非常接近命令模式 (dofactory.com/net/command-design-pattern)。如果可能,尝试通过构造函数而不是方法注入存储库。
标签: c# wcf design-patterns