2010-02-25 2 views
37

통신 나는 제프리 팔레르모에 의해 기술 된 Onion Architecture를 사용하여 ASP.NET MVC 응용 프로그램을 설계하고있다. 양파 archicecture 종속성 : 인프라 및 웹

그것은이다 나는 모든 뷰가 강하게 전용보기 모델을 사용하여 입력 할 것을 요구하고하는 ASP.NET MVC 2.0 프로젝트 - 우리는 우리의 견해에 도메인 모델을 통과하지 않습니다. 우리는 AutoMapper를 사용하여 번역을 수행하고 있습니다. AutoMapper는 인프라에서 격리되어 있습니다. Web은 AutoMapper가 사용되고 있다는 것을 모르고 있거나 신경 쓰지 않습니다. 이 서비스는 컨트롤러에 의해 사용되는 간단하기 때문에 그것은 자신의 뷰 모델에 직접 액세스 할 수 있습니다 -

현재, 나는 웹 프로젝트에서 IViewModelMapping 인터페이스를 정의하고있다. 이렇게하면 인터페이스가 도메인 모델 (코어)과보기 모델 (웹)에 모두 액세스 할 수 있습니다.

IViewModelMapping 인터페이스의 실제 구현을 제공하기 위해 Infrastructure 프로젝트에서 ObjectMapping 네임 스페이스를 만들었습니다. 그러면 실제 매핑 구현을 양파의 인프라로 분리 할 수 ​​있습니다. 이렇게함으로써 Infrastructure는 Core와 Web 모두에 의존해야합니다.

내 질문은 :이 프로젝트의 모두 (같은 층) 양파의 외곽에 기술적 때문에 - 하나 개의 프로젝트는 해당 레이어에서 다른 프로젝트에 대한 종속성을 가질 수? 이 디자인으로 잠재적 인 함정에 주목하는 사람이 있습니까?

대안 설계는 코어에 IViewMapper 인터페이스를 이동하는 것입니다 -하지만 핵심은 뷰 모델 클래스에 액세스 할 수 없기 때문에이 불가능하다. 뷰 모델을 코어로 옮길 수도 있지만, UI 레이어에만 해당되므로 뷰 모델을 코어에 포함시킬 수는 없습니다.

제안 된 아키텍처는 다음과 같습니다. Infrastructure는 Core 및 Web에 종속되어 있습니다. 웹은 고립되어 있으며 핵심 비즈니스 로직 만 이용할 수 있습니다.

http://www.matthidinger.com/images/onion-arch.png

+2

골라서 선택한 마지막 디자인은 무엇입니까? Interestingt 매핑에 대한 몇 가지 클래스 구조로 업데이트 된 다이어그램을 볼 :) –

+0

질문 : _Dependency Resolution Layer_ _Web Layer_에 대한 의존성이 있습니까? _Controllers_가 _Dependency Resolution Layer_에 종속되어서는 안됩니까? – a11smiles

답변

26

당신은 당신이 인프라는 UI (웹)에 의존하지 않는 것이 올바른지,하지만 난 가끔 그 규칙을 깰.

내가 방법지도와 IMapper을 만드는 대신 IViewModelMapping의 생각(). 그런 다음 인터페이스는 뷰 모델 매핑 또는 단순히 일반 매핑과 관련이있는 구현을 가질 수 있습니다. 어쨌든 인터페이스는 어떤 유형의 모델에도 의미 상으로 바인딩되어 있지 않기 때문에 코어에있을 수 있습니다.

멋진 그래픽. 나는 네가 묻는 질문에 대답하기를 바란다. 어니언 아키텍처의 전반적인 철학은 비즈니스 로직과 모델을 애플리케이션의 중간 (핵심)으로 유지하고 종속성을 가능한 멀리 바깥쪽으로 밀어 넣는 것입니다.

+2

고맙습니다. Jeffrey. 당분간은 디자인을 다시 고려할 것이지만, 그것이 큰 두통을 줄 때까지 그대로 유지할 것입니다. 나에게 가장 중요한 것은 내가 나중에 되돌릴 수없는 결정에 전념하지 않는다는 것이다. –

+0

당신은 대단하다 !!!. 흥미있는 일부 코드/proj 구조를 볼 :) –

0

개체 매핑으로 이동하십시오.

0

웹/UI 레이어는 인프라 계층에 종속 될 수 있습니다. 그러나 Infrastructure 레이어에 웹을 의존시키는 것은 좋은 디자인이 아닙니다. 양파 아키텍처는 가능한 한 바깥쪽으로 종속성을 푸시한다고 말합니다.

UI에 "\ Builder"폴더를 만들 수 있습니다. 하나의 인터페이스 파일 (예 : IBuilder 또는 IMapper)을 추가하고 ConvertToViewModel 또는 CreateMapping과 같은 메소드를 선언하십시오. 네가 좋아하는 것은 무엇이든.

* 작성자 ** IBuilder.cs - 여기에 메서드를 선언하십시오. ** Builder.cs - - ViewModel과 해당 DomainModel (코어 레이어의 참조) 간의 매핑을 정의하고 여기에 적절한 ViewModel을 반환하여 여기에 메서드를 구현합니다.