2010-05-14 2 views
0

내 컨트롤러/뷰와 관련하여 내 모델에서 상속을 처리하는 방법에 대해 고민했습니다.ASP.NET MVC2 & NHibernate의 모델 상속 처리

기본 모델 :

public class Procedure : Entity 
{ 
    public Procedure() { } 

    public int Id { get; set; } 
    public DateTime ProcedureDate { get; set; } 
    public ProcedureType Type { get; set; } 
} 

public ProcedureA : Procedure 
{ 
    public double VariableA { get; set; } 
    public int VariableB { get; set; } 
    public int Total { get; set; } 
} 

public ProcedureB : Procedure 
{ 
    public int Score { get; set; } 
} 

등 ... 결국 다른 절차의 많은.

public class ProcedureController : Controller 
{ 
    public virtual ActionResult List() 
    { 
     IEnumerable<Procedure> procedures = _repository.GetAll(); 
     return View(procedures); 
    } 
} 

을하지만 지금은 좀 붙어 :

그래서 나는 목록처럼 모든 절차를 일을. 기본적으로 목록 페이지에서 특정 하위 클래스 세부 정보를 보거나 편집 할 수있는 페이지에 링크해야하며 최상의 전략이 무엇인지 잘 모릅니다.

프로 시저를 사용하여 오른쪽 하위 클래스를 만들 때 사용할 저장소를 동적으로 파악하고 하위 클래스를로드하여 뷰로 전달할 수 있다고 생각했습니다. ProcedureType 객체에 클래스를 저장해야했습니다. 동적 인 캐스트를 할 수 없기 때문에 비 제너릭 IRepository를 생성/구현해야했습니다.

public virtual ActionResult Details(int procedureID) 
{ 
    Procedure procedure = _repository.GetById(procedureID, false); 
    string className = procedure.Type.Class; 
    Type type = Type.GetType(className, true); 
    Type repositoryType = typeof (IRepository<>).MakeGenericType(type); 
    var repository = (IRepository)DependencyRegistrar.Resolve(repositoryType); 
    Entity procedure = repository.GetById(procedureID, false); 
    return View(procedure); 
} 

하위 클래스 세부 정보를 표시하기 위해로드 할 부분을 결정하는 방법을 정렬하는 작업을 시작하지도 않았습니다.

이것이 좋은 접근 방법일까요? 따라서 URL을 쉽게 결정할 수 있습니다. 프로 시저 표시 코드를 쉽게 재사용 할 수 있습니다.

또 다른 접근법은 각 서브 클래스에 대한 특정 컨트롤러입니다. 컨트롤러 코드를 단순화하지만 많은 프로 시저 서브 클래스에 대한 많은 간단한 컨트롤러를 의미합니다. 부분 뷰를 사용하여 공유 프로 시저 세부 사항을 해결할 수 있습니다. 어떻게하면 처음에 컨트롤러/액션에 도착하는 URL을 구성 할 수 있습니까?

생각할 시간. 누군가가 나에게 빛을 보여줄 수 있기를 바랍니다. 미리 감사드립니다.

+0

"하위 클래스 세부 정보를 표시하기 위해로드 할 부분을보기로 결정하는 방법을 정렬하지도 않았습니다." 대부분의 질문을 구문 분석 할 수 없지만 이것이보기에 대한 잘못된 접근이라고 말할 수 있습니다. 컨트롤러가 사용할보기를 결정해야합니다. 모델을 기반으로 서로 다른 하위 뷰를 렌더링하기에 뷰의 논리가 충분하지 않아야합니다. –

+1

물론입니다. 컨트롤러가 부분을 결정합니다. 아마도 명명 규칙을 사용하여 (즉, ProcedureB에 대한 부분은 _ProcedureB 임) 또는 이와 비슷한 것입니다. –

답변

0

음 .... 내가 잘한 일은 잘되었지만 완전히 불필요한 것이었다.

내가 필요한 매핑이 제 위치에 있었거나 적어도 매핑 된 유형에 붙어 있어야한다는 것이 무엇입니까? 내가 동적 캐스팅 마법없이 필요한 모든 것을 디버깅하는 동안 나는 순간 전에 깨달았다. 그냥이 :

public virtual ActionResult Details(int procedureID) 
{ 
    Procedure procedure = _repository.GetById(procedureID, false); 
    return View(procedure); 
} 

이것은 nhibernate에서 조인 된 서브 클래스의 마법 덕택으로 작동합니다. 수퍼 클래스를 요청하면 수퍼 클래스로 캐스팅 된 해당 하위 클래스의 인스턴스가 생성됩니다 (모두 올바르게 설정된 경우).

멋지지만 성능은 궁금합니다. SQL 호출을 프로파일 링하고 모든 하위 테이블에서 외부 조인을 사용합니다. 많은 테이블 (40-50)과 많은 레코드가있을 때 병목 현상이 생깁니다. 숙고하고 탐구해야 할 것입니다.