ASP.NET Web API 领域驱动设计(领域事件)

Domain Driven Design (Domain Events) for ASP.NET Web API

为 Web API 项目实施 DDD/CQRS 的最佳方法是什么,因为我仍然不太了解从 Web API 调用其他服务时如何获得响应.我阅读了有关 Rx 可观察的内容,但我想要更清晰的解释和简单的示例 link 会很棒。我在 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事件名称应该使用通用语言更合适。这只是一个简单的示例,而且很简单。

现在,我想调用另一个,比方说第 3 部分网络 API 服务,它需要相当多的秒(长)响应。以及如何检索对 MyApiController 的响应和 return。根据 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 方网站 API 检索回对 MyApiController 的响应?
  3. 为 Web API 项目实施 DDD 的最佳方法是什么?

在此先致谢。

How to retrieve back the response from the 3rd party web API to MyApiController after the domain has been raised?

您在示例中展示的是典型的 publish-subscribe 模式。您不能 return 来自事件处理程序的数据,因为它违背了 "fire and forget" 方法的全部目的。引发事件的应用程序部分不应依赖于可能使用该事件的部分。事件表示已经发生的事情,因此在发布事件后,大多数时候您应该什么都不做。

What is the best way to implement DDD for Web API project?

没有 "best way" 可以做到这一点。每个决定都有其优点和缺点。你为什么决定首先使用 DDD?考虑给出一个 real-world 示例。

How do I do this in simple and better way?

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

另一件事是 "Hello" 看起来更像是一个命令,因为事件通常用过去时表达,例如"HelloHappened"。有些 real-world 场景会更可取,因为现在很难理解你的问题是什么。

查看 Jeffrey Palermo's series of articles 关于 ONION 的 C# 示例,这可能正是您所需要的。