대부분의 비즈니스 로직을 포함해야하는 컨트롤러 및 ViewModels의 경우?
해당 사항 없음.
필자는 실제적으로 모든 비즈니스 로직을 포함하도록 ViewModel을 얻는 몇 가지 방법을 시도했습니다. 그러나 작업 단위 (Unit of Work)를 사용하는 ViewModel의 생성자에 인수가 있어야합니다. 이것은 좋은 생각입니까?
imho 아주 좋은 생각입니다. 우선 여러분은 여러 가지 강건한 원칙을 깨고 있습니다. 모든 코드를 뷰 모델에 포함 시키면 테스트하기가 어렵습니다. 다른 뷰에서 비즈니스 로직 중 일부를 사용하려면 어떻게해야할까요? 그 코드를 복제합니까?
가장 좋은 방법은 무엇입니까?
먼저 MVC 패턴으로 돌아가 보겠습니다. 그것은 꽤 넓은 정의이지만, 당신이 어디에 배치해야하는지에 대한 느낌을 주어야한다는 것을 안다.
MVC의 "모델"은 실제로 데이터를 함께 가져 오는 데 사용되는 모든 것입니다. 웹 서비스, 비즈니스 계층, 리포지토리 등이 될 수 있습니다.
뷰는 HTML을 생성하는 모든 코드입니다 (웹에 대한 이야기이므로).
컨트롤러는 모델과 뷰 사이에 접착제로 간주되어야합니다. 따라서 모델로부터 정보를 가져 와서 뷰에서 사용할 수있는 것으로 변환해야합니다.
해당 구조의 문제점은 패턴의 다른 부분으로 특정 정보를 "누설"하는 것이 매우 쉽다는 것입니다. 따라서 Microsoft는 MVC 구현에 ViewModel을 도입했습니다.
이렇게하면 뷰에서 모든 렌더링 논리를 제거하고이를 ViewModel에 넣을 수 있습니다. 대신보기에이 일의 :
<span>@(model.Age == 0 ? "n/a" : model.Age)</span>
대신 뷰 모델 안에 그 코드를 넣어 간단하게 @model.Age
를 호출합니다. 이 방법으로 뷰 모델을 사용하는 모든 뷰에서 해당 코드를 복제 할 필요가 없습니다.
ViewModel에 대한 질문에 대한 대답은 "모델"의 정보를 올바르게 렌더링하는 데 사용되는 논리 만 포함해야한다는 것입니다.
컨트롤러에 관해서는 비즈니스 로직도 넣지 않을 것입니다. 우선, 그것은 당신의 논리를 테스트하는 것을 매우 어렵게 만듭니다. 그런 다음 책임을 추가합니다 (SRP 위반). 컨트롤러에서 유효한 유일한 논리는 ViewModel에서 정보를 가져 와서 "모델"에서 사용할 수있는 것으로 변환하는 것입니다. 그 반대의 경우도 마찬가지입니다.
귀하의 질문에 대한 답변입니다.
나는 별도의 프로젝트를 만들고 그것에 클래스를 추가 할
업데이트. 그런 다음 웹 프로젝트에서 참조를 추가하고 컨트롤러에서 해당 클래스를 호출하십시오.
컨트롤 컨테이너의 반전을 사용하여 나를 위해 자동으로 생성 된 종속성을 얻을 수도 있습니다.
Autofac은 모두 서비스를 검색하고 (제로 구성) 자신을 MVC에 삽입 할 수 있습니다.
는 분리 된 인터페이스 패턴은 다음과 같은 프로젝트를 만들 따르십시오 :
- YourProject.BusinessLayer <를 - 여기 클래스 추가
- YourProject.BusinessLayer.Specification < - 귀하의 비즈니스 계층을 정의하는 당신에게 인터페이스 추가 이리.
- YourProject.Mvc < - MVC 프로젝트.
은 "사양"프로젝트는 (몇 클래스와 반드시 전체 비즈니스 계층 수 있습니다) 쉽게 물건을 테스트하고 쉽게 구현을 전환 할 수 있도록하는 데 사용할 수 있습니다. "분리 된 인터페이스 패턴"을 읽어보십시오. 컨트롤러가 UoW를 호출하여 뷰 모델 구성에 필요한 데이터를 얻습니다.
좋은 답변입니다. 내 비즈니스 논리가 어디로 갈 것인지 물어보고 싶습니다. – TIHan
내 업데이트 읽기. – jgauffin
감사합니다. 나는 이것을 조사하기 시작할 것이다. – TIHan