2017-01-20 2 views
1

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

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?

Спасибо в продвижении.

ответ

0

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

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

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

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

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

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

Еще одна вещь, которая стоит упомянуть, заключается в том, что «Привет» выглядит больше как команда, потому что события обычно формулируются в прошедшем времени, например. "HelloHappened". Какой-то реальный сценарий будет более желательным, потому что сейчас довольно сложно понять, о чем идет речь.

Посмотрите на Jeffrey Palermo's series of articles о ONION с примерами на C#, которые могут быть именно тем, что вам нужно.

+0

Спасибо за подсветку. Причина, по которой я показываю простой пример, состоит в том, что теперь мне нужно сделать фундаментальную информацию о том, как это сделать. Любой простой пример использования DDD в ASP.NET Web API с одним контроллером, возможно, с помощью ссылки или GitHub, был бы хорош для меня. –

+0

DDD не имеет ничего общего с Web API. Вы будете вызывать методы уровня приложений из ваших контроллеров, но здесь нет ничего особенного в ASP.NET Web API. Попробуйте взглянуть на серию статей Джеффри Палермо об ОНИОНе с примерами на C# http://jeffreypalermo.com/blog/the-onion-architecture-part-2/, которые могут быть именно тем, что вам нужно. – IlliakaillI

+0

Я знаю ASP.NET Web API, который использует DI/IoC, CQRS и т. Д. Я хотел бы узнать больше, используя концепцию DDD для Web API. Я не новичок, и я изучаю DDD для лучшей практики ASP.NET Web API. И нет, но не Лук для меня. Я хочу использовать DDD. –

Смежные вопросы