查询和命令是否继续被认为是单独的?
是的,通常情况下,您会激发一个命令,如果您在执行此操作后需要更新UI,则会执行查询以获取新信息。一个例子会说明这一点。
假设你会为特定区域分配一个特定的警卫。该命令(它只是一个DTO)需要的唯一信息是护卫的Id
和该区域的Id
。关联的CommandHandler
将执行处理这个的所有任务,例如,从另一个区域移除该警卫,将他预订为不可用等。
现在您的用户界面会想要显示更改。用户界面可能包含所有警卫及其指定区域的列表。此列表将由单个GetActiveGuardsAndAreaQuery
填充,这将返回List<GuardWithAreaInformationDto>
。这DTO
可能包含所有警卫的各种信息。从命令中返回这些信息并不是一个完全分离的问题,因为原子命令处理可以很好地用于类似但略有不同的用户界面,这将需要对UI信息进行稍微不同的更新。
例如登录尝试。这是一个查询或命令?
IMO登录尝试既不是。这是一个横切关注点,数据隐藏在安全连接背后的实现细节。但是应用程序不应该关注这个细节。考虑将此应用程序与其他客户一起使用,您可以在其中承载WebApi服务,并在Active Directory
域中使用Windows Authentication
。在这种情况下,用户只需登录到他的机器,并在通信时由客户端和服务器OS处理安全性。
使用模式可以很好地完成使用AuthenticateToWebApiServiceCommandHandlerDecorator
,确保他们是登录凭据服务通过以模态形式询问用户,从配置文件中读取或任何其他。
检查凭据是否可以通过执行一种标准来完成Query
您的应用程序总是需要诸如CheckIfUpdateIsAvailableQuery
。如果查询成功,则登录尝试成功,否则失败。
如果一个命令处理程序返回void,那么如何告诉主讲者用户创建请求是否成功?
虽然看起来void
没有返回任何东西,但这不是真的。因为如果它没有失败并带有一些异常(带有明确的信息出了什么问题!)它一定成功了。
在上述博客文章的follow up中@dotnetjunkie描述了一种从命令返回信息的方式,但是会注意到帖子顶部添加的评论。
总之,从扔命令失败清晰异常。你可以添加一个额外的抽象层客户端来处理这个很好。而不是直接注入commandhandler到不同的主持人,你可以注入IPromptableCommandHandler
其在编译的时候只有一个开放的通用实现:
public interface IPromptableCommandHandler<TCommand>
{
void Handle(TCommand command, Action succesAction);
}
public class PromptableCommandHandler<TCommand> : IPromptableCommandHandler<TCommand>
{
private readonly ICommandHandler<TCommand> commandHandler;
public PromptableCommandHandler(ICommandHandler<TCommand> commandHandler)
{
this.commandHandler = commandHandler;
}
public void Handle(TCommand command, Action succesAction)
{
try
{
this.commandHandler.Handle(command);
succesAction.Invoke();
}
catch (Exception)
{
MessageBox.Show("An error occured, please try again.");
// possible other actions like logging
}
}
}
// use as:
public void SetGuardActive(Guid guardId)
{
this.promptableCommandHandler.Handle(new SetGuardActiveCommand(guardId),() =>
this.RefreshGuardsList());
}
在一天结束的时候,对于任何给定UI任务(比如在用户创建请求),它结束了,你最终有一个WinForms基于客户端的查询/命令,以及命令/查询它处理上为此请求的网页API服务的版本?
不!
你应该建立一个单一的开放式泛型
CommandHandlerProxy
这仅仅任务是通过命令DTO到的WebAPI服务
客户端。
对于服务端架构,你应该阅读其他跟进:描述一个服务器端架构非常漂亮,处理这个Writing Highly Maintainable WCF Services。链接的项目还包含WebApi的实现!
Ric的答案是现货。我没有什么补充。 – Steven