1

많은 육각형 건축물을 읽었으며 대부분의 개념을 얻었습니다. (내가 원했을 때) 찾지 못했습니다. 해당 아키텍처 유스 케이스 현명한.6 각형 아키텍처 - 간단한 사용 사례

내 응용 프로그램 도메인 모델은 사람들을 취하게 만드는 것이라고 가정 해 봅시다. 전체 비즈니스 로직은 도메인 계층에 상주하는 Person 클래스에 포함됩니다.

class DoctrinePersonRepository implements PersonRepository 
{ 
    public function findPersonByName($name) 
    { 
     // actual retrieving 
    } 
} 

의 난에 액세스하여 사람이 술에 취해 만들고 싶어 가정 해 봅시다 : GET /person/johnDoe/drink

class Person 
{ 
    private $name; 
    private $age; 

    function __construct($name, $age) 
    { 
     $this->age = $age; 
     $this->name = $name; 
    } 

    public function drink() 
    { 
     if ($this->age < 18) { 
      echo $this->name . ' cant drink'; 
     } 

     echo $this->name . ' drinks tequila'; 
    } 
} 

도메인 층도에 의해 구현 PersonRepository

interface PersonRepository 
{ 
    public function findPersonByName($name); 
} 

이 포함되어 있습니다. 내가 좋아하는 유스 케이스 만들어야합니다

class MakePersonDrinkCase 
{ 
    /** 
    * @var PersonRepository 
    */ 
    private $personRepository; 

    function __construct(PersonRepository $personRepository) 
    { 
     $this->personRepository = $personRepository; 
    } 

    function makePersonDrunk($name) 
    { 
     $person = $this->personRepository->findPersonByName($name); 

     if ($name) { 
      throw new \Exception('Person not found'); 
     } 

     $person->drink(); 
    } 
} 

을 컨트롤러에서 호출? 이 언급 된 사례가 도메인 계층 또는 응용 프로그램 계층에 있어야합니까? 이 경우 포트 및 어댑터 란 무엇입니까? 이 사람을 취할 방법을 원한다면 - 하나는 GET 요청이고, 다른 하나는 CLI 명령 인 php console person:drink John입니까? 내 앱을 어떻게 구성해야합니까?

+0

나는 거의 다 왔다고 생각한다. 중요한 것은 18 세가 넘지 않으면 마실 수 없어야한다는 도메인 논리가 도메인 모델 내부에 있고 도메인 모델 외부에 있지 않다는 인식이다. 주변 인프라는 단순히 외부 세계의 명령을 도메인 모델에 대한 명령에 적용하기 위해 존재합니다. – Matt

+0

당신의 예를 사랑하십시오 : DI가 최근 귀하의 질문 중 일부에 답하는 게시물을 작성했습니다. 유용하다고 생각할 수 있습니다. http://jenko.me/ddd/2015/01/23/building-a-house-with-ddd/ – Jenko

+0

어느 정도 그것을 설명하는 또 다른 기사 : http://t.co/U7SZZcvevn – axiac

답변

0

예, 당신이 한/제안 된 것이 옳습니다.

  • 사용 사례는 응용 프로그램 계층에 있습니다. 그러나 이것은 DDD의 단서이며 특히 육각형 아키텍처와 관련이 없다는 점에 유의하십시오.

  • 귀하의 어댑터는

    1. 컨트롤러와 함께 웹 서버입니다.
    2. DoctrinePersonRepository와 함께 교리하십시오.
    3. PHP를 실행 + 컨트롤러 다시
  • 귀하의 포트 (컨트롤러가 CLI 응용 프로그램에서 사용하는 재 가정). 콕번은 What exactly a port is and isn’t is largely a matter of taste."가 개인적으로 나는 당신이이 개 포트를 가지고 있다고 말할 것입니다 "라고 I을 '당신이 한 어댑터가있는 지속성 포트 그 이름을 거라고, 나는 다른 이름 것'당신은이 어댑터가있는 사용 '포트,

육각형 구조의 한 호출기. 물론이다 http://alistair.cockburn.us/Hexagonal+architecture

1

TL : DR : DDD 관점에서 볼 때 기본적으로 옳습니다. 그러나 6 각형 디자인을 사용하려면 기본 포트에서 유스 케이스를 등록하거나 노출 할 수 있어야합니다. 웹, 콘솔 또는 "usage"로 표시됩니다 (@chris-f-carroll).

저는 현재 큰 Java8 코드베이스 프로젝트에서 작업하고 있으며 클린 아키텍처/수직 슬라이싱 및 CQRS 원칙에 따라 애플리케이션을 구조화했습니다. 우리는 6 개의 포트가있는 육각형을 가지고 있습니다 : 웹, 콘솔, 데이터베이스, 스케줄링, 대기열 및 이메일.

우리의 앱을 초기화하기 위해 우리는 필요한 모든 어댑터를 만들고이를 사용하여 앱 인스턴스를 만듭니다.그런 다음 앱의 모듈은 기본 포트 어댑터에 유스 케이스를 명시 적으로 등록합니다. 마지막으로 기본 포트 어댑터를 시작하고 앱이 실행 중입니다.

Alistair Cockburn tells "포트는 의도적 인 대화를 식별합니다." 우리의 설계가 CQRS를 암시하기 때문에, 우리의 응용 프로그램과 HTTP 프로토콜 간의 의도적 인 대화는 질의와 명령 (우리의 유스 케이스) 노출에 관한 것입니다.

get (uri, handler), post (URL GET 또는 POST와 같은) 이러한 쿼리와 명령이 노출되는 방식은 내 육각형이 알 필요가없는 웹 포트 어댑터의 구현 세부 사항입니다.

관련 문제