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
{
{
我的问题是:
- 如何以简单且更好的方式做到这一点?
- 如何在域名被提升后从第 3 方网站 API 检索回对 MyApiController 的响应?
- 为 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# 示例,这可能正是您所需要的。
为 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
{
{
我的问题是:
- 如何以简单且更好的方式做到这一点?
- 如何在域名被提升后从第 3 方网站 API 检索回对 MyApiController 的响应?
- 为 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# 示例,这可能正是您所需要的。