문제

모호한 제목을 용서해주십시오. 나는 그것을 설명하는 방법을 잘 모르겠습니다.

일반 모델 "아카이브"가있는 경우 사용자가 선택한 '유형'을 기반으로 다른 뷰/양식을 어떻게 표시합니까?

예를 들어, 사용자는 새로운 "아카이브"를 작성한 다음 비디오, 책, 오디오 등을 선택할 수 있습니다. 여기에서 아카이브 유형을 기반으로 다른 양식을 얻습니다.

아니면 비디오, 책, 오디오 등 다른 모델로 나누는 것이 더 낫습니까?

또는 모델이 상속 될 수 있습니다 (비디오 확장 아카이브). 나는 이것이 기본적인 OOP / 클래스라고 생각하지만 여기에 적용하는 방법은 전혀 모른다.

모든 MVC 프레임 워크의 예제를 환영합니다!

도움이 되었습니까?

해결책

아카이브에서 유형을 상속 받고 싶지 않은 것 같습니다. "항상 상속에 대한 캡슐화/격리를 선호합니다".

아카이브라는 클래스를 만들고 유형 속성을 제공하지 않겠습니까? 이 유형은 상속을 사용하여 오디오, 비디오 등을 전문화 할 수 있습니다.

다른 기준에 따라 아카이브를 전문으로하는 것 같습니다. "FileSystemArchivce", "xmlarchive", "sqlarchive"및 유형이 변경되지 않습니다. 그러나 저의 Agilist는 이것이 처음에는 필수가 아니라고 말하고 나중에 디자인을 항상 리팩토링 할 수 있다고 말합니다.

컨트롤러 측면에서 볼 때 각 유형의 프레젠테이션 차이점을 캡슐화하여 벅에 대한 가장 큰 강타를 얻을 수 있습니다. 따라서 유형에 따라보기 만 변경됩니다. 각각의 의미와 규칙은 동일하며 각 유형에 대해 별도의 컨트롤러를 가질 필요가 없습니다. 뷰는 속성이 다르므로 각 유형마다 다릅니다.

다른 팁

실제로 MVC 프레임 워크에서 다른보기를 쉽게 보여 주려면 쉬워야합니다. 예를 들어, Microsoft ASP.NET MVC에서는 다음과 같은 컨트롤러에서보기를 반환하는 것이 아닙니다.

return View();

그러나 실제로보기의 이름을 매개 변수로 명시합니다.

return View("VideoArchive");

그런 다음 Views/Archive/Videoarchive.aspx에서보기를 표시합니다.

모델 비디오, 책 및 오디오는 아카이브에서 상속 될 수 있습니다.

각 모델에는 컨트롤러가 있습니다.

http : // yourserver/books/edit/11

해당 모델을 만들기 전에 사용자가 원하는 아카이브 유형을 선택하도록해야합니다.

편집 (댓글 응답으로)

ASP.NET MVC에서는 모델이 클래스가됩니다.

public class Video : Archive
{  
    public int Id {get;set}
    public string Name {get;set;}     
    ...
}

컨트롤러도 있습니다

public class VideoController : Controller
{
    public object Edit(int id)
    {
        Video myVideo = GetVideo(id);
        return View("Edit", myVideo);
    }
     ...
}

예를 들어 Views 디렉토리에서 뷰가 포함되어 있습니다.

public class Edit : View<Video>
{
    ...
}

그래서 당신은 당신이 URL이 있으면 이것을 호출 할 수 있습니다.

http : // localhost/video/edit/11

이것은 모두 메모리에서 이루어 졌으므로 실수가있을 수 있지만 집에있는 메시지는 모델의 상속을 지정한다는 것입니다. 모델은 단지 수업 일뿐입니다. 귀하의 경우 아카이브에서 상속을 원합니다. 일단 완료 한 후에는 모델이 정상적으로 통과됩니다.

MVC에 유리한 한 가지 확실한 점은 모든 사용자가 요구하는 모든 사용자가 다른보기 인 경우 모델 (또는 하나만 원하는 컨트롤러)을 사용자 정의 할 필요가 없다는 것입니다. 스토리지 (Persistence) 아키텍처가이를 필요로하는 경우에만 여러 모델이 나타납니다. DAO (Data Access Objects)와 같은 일부 기능은 여러 모델이 필요한 경우 컨트롤러와 모델 사이에 다른 계층으로 나타날 수 있습니다.

살펴보십시오 아파치 스트럿 예제를위한 프로젝트. 언급 된 바와 같이 초보자를위한 스트럿, "스트럿을 잘 사용하려면 기초를 잘 이해하는 것이 중요합니다. 검토부터 시작하십시오. 주요 기술 프라이머, 그리고 낯선 주제를 연구하고 있습니다. "

다른 리소스는 참조하십시오 웹 계층 애플리케이션 프레임 워크 설계 (Sun J2ee Blueprints)

그만큼 단일 책임 원칙 (PDF)는 다음을 설명합니다.

수업이 바뀌는 이유는 없어야합니다.

아카이브 클래스는 여러 가지 다른 유형의 아카이브를 처리 하여이 원칙을 위반합니다. 예를 들어, 비디오 아카이브를 업데이트 해야하는 경우 책 및 오디오 아카이브를 처리하는 클래스도 수정하는 것입니다.

이를 처리하는 적절한 방법은 각기 다른 유형의 아카이브에 대해 별도의 클래스를 만드는 것입니다. 이러한 유형은 특정 아카이브 유형이 아닌 아카이브에만 관심이있는 코드로 상호 교환 적으로 (다형) 처리 될 수 있도록 공통 인터페이스 (또는 공통 기본 클래스를 상속)를 구현해야합니다.

해당 클래스 계층 구조를 마련하면 각 모델 클래스에 대해 단일 컨트롤러와보기 만 있으면됩니다.

보너스 포인트의 경우 단일 책임 원칙은 모델,보기 및 컨트롤러 객체를 만들기 위해 공장 방법이나 추상 공장을 사용하는 것을 정당화 할 수도 있습니다 (새로 켜지는 대신). 결국, 객체를 만들고 해당 객체를 사용하는 것은 다른 책임이므로 다른 이유로 변경해야 할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top