1

为 Web API 项目实现 DDD/CQRS 的最佳方法是什么,因为我仍然不太了解从 Web API 调用其他服务时如何获得响应。我阅读了有关 Rx observable 的内容,但我想要一个更清晰的解释和简单的示例链接会很棒。我在 ASP.NET Web API 和 Autofac 中使用 Udi Dahan 样式的域事件进行注入。这是我尝试在 Controller 的 Web API 中使用域事件的方法。我所做的代码都在工作。

public class MyApiController : ApiController
{
    // POST: api/myapi
    public void Post([FromBody]string value)
    {
        DomainEvents.Raise(new HelloMessage(value));
    }
}

这引发了事件处理程序:

public void HelloMessagesHandler : IDomainEventHandler<HelloMessage>
{
    public void Handle(HelloMessage @event)
    {
        Log.Write($"Hello {@event.Value}");
    {
{

当然,HelloMessage 事件名称应该使用通用语言,这样会更合适。这只是一个简单的示例,这很容易。

现在,我想调用另一个,比如说第三部分 Web API 服务,它需要相当长的时间来响应。以及如何检索响应并返回到 MyApiController。根据 Udi Dahan 的说法,直接在处理程序中使用这不是一个好主意。例如:

public void HelloMessagesHandler : IDomainEventHandler<HelloMessage>
{
    private readonly IService _service;

    public HelloMessagesHandler (IService service)
    {
        _service = service;
    {

    public void Handle(HelloMessage @event)
    {
        var response = _service.DoSomethingWithLongProcess(@event.Value);
        // return response <-- to MyApiController
    {
{

我的问题是:

  1. 我如何以简单和更好的方式做到这一点?
  2. 如何在域被提升后从第 3 方 Web API 检索响应到 MyApiController?
  3. 为 Web API 项目实施 DDD 的最佳方法是什么?

提前致谢。

4

1 回答 1

0

如何在域被提升后从第 3 方 Web API 检索响应到 MyApiController?

您在示例中演示的是典型的发布-订阅模式。您不能从事件处理程序返回数据,因为它违背了“即发即弃”方法的全部目的。引发事件的应用程序部分不应依赖于可能消耗事件的部分。事件是已经发生的事情的指示,因此在发布事件后,您大部分时间都不应该做任何事情。

为 Web API 项目实施 DDD 的最佳方法是什么?

没有“最好的方法”来做到这一点。每个决定都有其优点和缺点。你为什么首先决定使用 DDD?考虑举一个真实世界的例子。

我如何以简单和更好的方式做到这一点?

您展示的代码并不复杂。为了进一步简化,您可以直接从控制器调用服务的方法,不需要域事件,至少在上面的示例中。

另一件要提到的是“Hello”看起来更像是一个命令,因为事件通常以过去时形式表达,例如“HelloHappened”。一些现实世界的场景会更可取,因为现在很难理解你的问题是什么。

看看Jeffrey Palermo关于 ONION 的系列文章以及 C# 中的示例,这可能正是您所需要的。

于 2017-01-20T04:19:20.767 回答