2013-08-21 3 views
4

WebA & WebB와 같은 두 개의 서로 다른 프로젝트가 있습니다. 두 웹 사이트의 구조는 사용하는 컨트롤러와 모델면에서 동일합니다. 그러나 프런트 엔드는 매우 다릅니다. 그들은 각각 자신의 UI와 자신을 위해 작동하는 jquery 플러그인을 가지고 있습니다.컨트롤러 재사용 asp.net mvc

코드 중복을 줄이기 위해이 두 프로젝트가 다른 참조 된 프로젝트 [controllerDLL]의 컨트롤러에서 상속 받도록 제안합니다. ControllerDLL은 비즈니스 레이어를 호출하고 json 직렬화 된 모델 객체를 반환하기위한 모든 로직을 포함하는 프로젝트입니다. WebA & WebB에는 각각 기본 프로젝트 [controllerDLL]에서 상속 한 빈 컨트롤러 클래스가 있습니다. 이렇게하면 컨트롤러 코드가 중복되지 않는다고 느낍니다.

내가 제안한 방식 이외의 컨트롤러 재사용을 달성하는 더 좋은 방법은 누구나 알 수 있습니까? asp.net mvc 4이 더 나은 할 수있는 기본 제공 방법을 제공합니까? 여기에 AREAS를 생산적으로 사용할 수 있습니까? DotNetNuke는 내가 봐야 할 것입니까? 아니면 내 접근 방식이 최선의 방법인가요? 컨트롤러를 다른 프로젝트로 옮기는 방법을 찾고 있지 않습니다. 나는 컨트롤러 재사용을위한 나의 옵션이 무엇인지 알고 싶다.

감사합니다.

+0

http://dotnetslackers.com/articles/aspnet/storing-asp-net-mvc-controllers-views-in-separate- assemblies.aspx – Satpal

답변

2

SO question을보세요. 동일한 프로젝트에서 모든보기를 유지하고 사용자 지정보기 엔진을 사용하여보기를 찾을 수 있습니다 (web.config 설정 기반).

예를 들어/Views/WebA 및/Views/WebB 폴더가 2 개있을 수 있습니다. 사용자 지정보기 엔진은 web.config 설정을 검색하여 사용할 폴더를 찾고 거기에서보기를 검색 할 수 있습니다. 이렇게하면 컨트롤러 코드를 복제하거나 별도의 프로젝트로 옮길 필요가 없습니다. 런타임시 한 프레젠테이션 계층을 다른 계층으로 스왑합니다.

+1

두 프로젝트가 실제로 두 개의 별도 사이트로 배포 되었기 때문에이 접근법에 대해서는 잘 모르겠습니다. 두 프로젝트의 견해가 하나의 견해로 합쳐지면 더 이상 별도로 배포 할 수 없을 것이라고 생각합니다. – asymptoticFault

+0

@asymptoticFault 왜 그들을 개별적으로 배치 할 수 없는지 알지 못합니다.올바른보기를 사용하도록 web.config 설정을 변경하면이 설정을 10 개의 다른 서버/사이트에 배포하는 것을 중단해야합니까? – Becuzz

+0

두 세트의 뷰를 서로 다른 사이트로 배치 할 수 있다는 것은 그들이 원했던 것이기 때문입니다. – asymptoticFault

2

구성 설정을 기반으로 올바른 컨트롤러 클래스를 인스턴스화하기 위해 사용자 지정 컨트롤러 팩토리를 구현하여이 작업을 수행 할 수 있어야합니다. RequestContext 및 컨트롤러 이름을 기준으로 컨트롤러 인스턴스를 만들려면 -

1.System.Web.Mvc.IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)는 :

는이 인터페이스의 인터페이스 System.Web.Mvc.IControllerFactory.The 두 ​​가지 방법은 구현해야합니다.

2.void ReleaseController(System.Web.Mvc.IController controller) - 두 응용 프로그램 사이의 차이의 의견을하기 때문에, 별도의 프로젝트로이 필요하지 않는 컨트롤러 인스턴스를

Detailed information about using that interface is available

+0

다음 링크를 참조 할 수도 있습니다. http://stackoverflow.com/questions/401376/asp-net-mvc-put-controllers-into-a-separate-project – DarthVader

0

을 놓습니다. 당신은 두 세트의 뷰를 가질 수 있고 웹 설정의 다른 설정을 사용하여 동일한 프로젝트를 두 번 전개 할 수 있습니다. 이렇게하려면 컨트롤러가 올바른 올바른 뷰를 반환 할 수 있도록 자신의 ViewEngine을 구현해야합니다. 다음과 같이

public class AppSettingViewEngine: RazorViewEngine 
{ 
    public AppSettingViewEngine() 
    { 
     string[] viewLocations = new string[] { }; 
     if (ConfigurationManager.AppSettings["Site"] == "WebA") 
     { 
      viewLocations = new[] { 
       "~/WebB/Views/{1}/{0}.cshtml", 
       "~/WebB/Views/{1}/{0}.cshtml", 
       "~/WebB/Views/Shared/{0}.cshtml", 
       "~/WebB/Views/Shared/{0}.cshtml", 
      }; 
     } 
     if (ConfigurationManager.AppSettings["Site"] == "WebB") 
     { 
      viewLocations = new[] { 
       "~/WebB/Views/{1}/{0}.cshtml", 
       "~/WebB/Views/{1}/{0}.cshtml", 
       "~/WebB/Views/Shared/{0}.cshtml", 
       "~/WebB/Views/Shared/{0}.cshtml", 
      }; 
     } 
     else 
     { 
      //Default Settings 
      viewLocations = new[] { 
       "~/Views/{1}/{0}.cshtml", 
       "~/Views/{1}/{0}.cshtml", 
       "~/Views/Shared/{0}.cshtml", 
       "~/Views/Shared/{0}.cshtml", 
      }; 
     } 

     this.PartialViewLocationFormats = viewLocations; 
     this.ViewLocationFormats = viewLocations; 
    } 
} 

그런 다음 당신은 당신의 위해 Application_Start에 등록

protected void Application_Start() 
{ 
    ViewEngines.Engines.Clear(); 
    ViewEngines.Engines.Add(new AppSettingViewEngine()); 
}