2011-05-08 2 views
0

Zack Owens의 개요에 따라 멀티 테넌시를 사용하는 응용 프로그램을 작성 중입니다.멀티 테넌트 MVC 3보기 모델의 응용 프로그램 문제

Zack의 예에서 각 테넌트에 대한 컨트롤러와 뷰를 저장하기 위해 별도의 C# 클래스 라이브러리가 있습니다. 필자는 뷰를 컴파일 한 Spark View 엔진을 사용하지 않기 때문에 옵션이 아닙니다. 대신 각 임차인을 위해 별도의 MVC3 앱 프로젝트를 만들었습니다. 콘텐트, 컨트롤러, 뷰 등을 저장하고 있습니다.

커스텀 컨트롤러 팩토리가있는 메인 MVC 앱 프로젝트 (시작 앱)가 있습니다. Zacks 예제와 유사한 어셈블리를 스캔하고 구조 맵을 사용하여 종속성 삽입을 설정합니다. 컨트롤러보기를 사용하여 올바른보기를 잡는 뷰 엔진이 있습니다. 임차인 응용 프로그램에서 뷰 또는 종속성을 찾을 수 없으면 MVC App 프로젝트의 뷰 또는 종속성을 사용합니다. 뷰 모델을 제외하고 모든 것이 효과적입니다.

우리보기 중 대부분은 (전부는 아니지만)보기 모델에 전달됩니다. 세입자가 사용자 정의보기와 함께 갈 수 있도록 사용자 정의보기 모델을 가질 수 있도록 View App 클래스가 Main App Project가 아닌 Tenant App Project에 있어야합니다.

작동하는 것처럼 보이지만 계속 오류가 발생합니다.

시나리오 # 1 - 기본 MVC App Project에 기본보기 모델이 있습니다. Tenant App은 Main App에 대한 참조를 가지므로 기본 View Model을 사용할 수 있습니다. 아무 문제 없습니다. 이제 View Model을 추가하거나 View Model을 재정의하려면 클래스를 만들어 Tenant App에 저장합니다. 문제는 페이지를 호출 할 때 메인 애플리케이션에서 테넌트 애플리케이션에 대한 참조가없고 순환 참조 문제로 인한 것이 아니기 때문에 메인 MVC 애플리케이션이 새로운 뷰 모델을 찾을 수 없다는 것입니다.

시나리오 # 2 - 거주자 응용 프로그램에서 참조를 주 응용 프로그램으로 제거합니다. 그런 다음 기본 애플리케이션에서 기본 애플리케이션 모델을 기본 애플리케이션으로 복사하고, 이름 공간을 변경하고, 기본 애플리케이션에서 보조 애플리케이션으로 참조를 작성하여 기본 애플리케이션에서 뷰 모델 클래스에 액세스 할 수 있도록합니다.

나는 다음을 실행하고 다음과 같은 오류가 발생합니다 :

사전에 전달 모델 항목 유형 'Sample.Models.Login'의이지만,이 사전은 유형 'Sample.Models의 모델 항목을 필요로 .로그인'.

오류는 의미가 있지만 실제로는 아닙니다. Sample.Models.Login이라는 클래스가 하나뿐입니다.

저는 이것이 왜 이렇게하고 있는지에 대한 가정을 가지고 있지만 알아낼 수는 없습니다. 모든 팁이나 조언을 크게 주시면 감사하겠습니다.

고맙습니다.

+0

참고로보기를 컴파일 할 수 있습니다. 언로드 할 프로젝트를 마우스 오른쪽 단추로 클릭 한 다음 마우스 오른쪽 단추로 클릭하여 편집 한 다음 첫 번째 그룹의 마지막 항목 (MvcBuildViews)을 false 대신 true로 설정합니다. 프로젝트를 저장하고 다시로드하고 컴파일하십시오. –

답변

0

잘 모르겠지만 어쨌든 갈 것입니다.

다른보기 모델이 필요한 경우 우선 다른 컨트롤러/동작이 있어야합니다. 아마도 추가 정보를 추가하기를 원할 것입니다.이 경우 사용자 지정된보기 모델은 원래보기 모델을 기반으로해야합니다. 기본 뷰 모델을 별도의 어셈블리로 이동하여 순환 참조 문제를 해결할 수 있습니다. Managed Extensibility Framework와 같은 플러그인 프레임 워크를 사용하여 참조 문제를 관리 할 수도 있습니다.

그러나 주어진 컨트롤러/동작에 대해보기 주요 부분의 데이터 요구 사항은 임차인에 관계없이 상당히 일정해야합니다. 그것이 다른 데이터를 필요로한다면 그것은 아마 똑같은 일을하지 않을 것이고 다른 행동에 있어야합니다.

즉, 한 명의 세입자는 모든 페이지 상단에 미니 바구니를 넣을 수 있지만 다른 세입자는 그렇지 않을 수 있습니다. 따라서 바구니 데이터를 포함하기 위해 사용자 지정보기 모델이 필요하다고 생각할 것입니다. 그러나이 작업을 수행하는 더 좋은 방법은 예를 들어 (Razor에서) @ Html.RenderAction ("minibasket")에 대한 호출을 포함하도록 해당 테넌트의 마스터 페이지를 변경하는 것일뿐입니다.이 작업은 추가 기능을 가져 오는 작업을 담당합니다 바구니 데이터.

제쳐두고, 아담이 제안한 것처럼보기를 컴파일하려는 경우 추가 옵션은 RazorGenerator입니다.

관련 문제