Доменно-управляемый дизайн (доменные события) для ASP.NET Web API

Каков наилучший способ реализации проекта DDD/CQRS для веб-API, поскольку я до сих пор не совсем понимаю, как получить ответ при вызове другой службы из веб-API. Я читал о наблюдаемых вещах Rx, но я хотел бы получить более четкое объяснение, и было бы здорово получить простую ссылку на образец. Я использую Udi Dahan стиль доменных событий в ASP.NET Web API и Autofac для внедрения. Вот что я пытаюсь использовать доменные события в Web API в Controller. Код, который я делаю, все работает.

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 должно использовать вездесущий язык, который будет более подходящим. Это простой пример, и это было легко.

Теперь я хотел вызвать еще одну, скажем, третью часть веб-API-сервисов, на ответ которой уходит довольно много секунд. И как мне получить ответы и вернуться к MyApiController. По словам Уди Дахана, это не очень хорошая идея, чтобы использовать его непосредственно в обработчике. Например:

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. Как получить ответ от стороннего веб-API на MyApiController после поднятия домена?
  3. Каков наилучший способ реализации проекта DDD для веб-API?

Заранее спасибо.

1 ответ

Решение

Как получить ответ от стороннего веб-API на MyApiController после поднятия домена?

То, что вы продемонстрировали в своем примере, представляет собой типичный шаблон публикации-подписки. Вы не можете возвращать данные из обработчиков событий, потому что они не соответствуют цели "запускай и забывай". Часть приложения, которая вызывает событие, не должна зависеть от частей, которые могут потреблять событие. Событие является показателем того, что уже произошло, поэтому после публикации события большую часть времени вы просто ничего не должны делать.

Каков наилучший способ реализации проекта DDD для веб-API?

Нет лучшего способа сделать это. Каждое решение имеет свои плюсы и минусы. Почему вы решили использовать DDD? Попробуйте привести пример из реальной жизни.

Как мне сделать это простым и лучшим способом?

В коде, который вы показали, нет ничего сложного. Чтобы еще больше упростить его, вы можете вызывать метод вашего сервиса напрямую из контроллера, нет необходимости в событии домена, по крайней мере, в приведенном выше примере.

Следует также отметить, что "Hello" больше похоже на команду, потому что события обычно формулируются в прошедшем времени, например "HelloHappened". Какой-то реальный сценарий был бы более желательным, потому что теперь довольно трудно понять, в чем заключается ваша проблема.

Взгляните на серию статей Джеффри Палермо об ONION с примерами на C#, которые могут быть именно тем, что вам нужно.

Другие вопросы по тегам