1

새 프로젝트 인 Windows Forms C# 응용 프로그램에서 Model-View-Controller-Pattern을 사용하려고합니다.MVC-Pattern에서 여러 폼을 관리하는 방법

Core 
UI (View) 
Controller 
Model 
Services 
Helper 
Tests 

dependecies가 같다 프로젝트는 다음과 같습니다 : 나는 여러 하위 프로젝트로 내 프로젝트 분할이 Project Dependencies (generated by Visual Studio

내 UI-프로젝트 2 양식, ListForm 및 AddForm을 포함을 (거기에 다른 형태가 있지만,이 이 질문과 관련 없음).

  • Controller-Project에서는 컨트롤러가보기를 업데이트하는 데 사용하는 여러 가지 양식의 인터페이스가 있습니다.

  • 코어 프로젝트에서 새 ListForm, 컨트롤러 및 모델을 초기화합니다.

사용자가 ListForm 내에서 Add-Button을 클릭하면 AddForm이 표시되기를 원합니다. 컨트롤러가 UI 프로젝트를 알지 못하는 경우 어떻게 AddForm의 새 인스턴스를 만들 수 있습니까?

서비스를 사용하려고했지만 서비스가 인스턴스를 만들기 위해 UI 프로젝트를 알아야했기 때문에 Visual Studio에 따라 순환 종속성을 가졌을 것입니다.

사용자가 ListForm 내에서 Add-Button을 클릭하면 어떻게 AddForm을 표시 할 수 있습니까? (한 번에 최대 1 개의 AddForm이 항상 표시됨).

+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

답변

2

가능한 접근법 중 하나는 컨트롤러 팩토리입니다. 팩토리는 컨트롤러와 뷰를 생성하고 둘 다 함께 연결하는 일을 담당합니다.

다른 뷰 세트에 대해 다른 구현을 가질 수 있도록 공장을 구성 할 수 있어야합니다. 실제 ui를 빌드하는 데 사용되는 뷰 세트에는 자체 공장이 있고 다른 테스트 세트에는 다른 공장이 있습니다. 모든 공장에 액세스합니다. 같은 api를 통해 필요한 경우에만 공장을 다시 구성 할 수 있습니다. 그러한 공장을 구현할 수있는 방법 중 하나는 IoC 컨테이너를 사용하는 것이지만 구현을 단순화 할 수는 있지만 반드시 필요한 것은 아닙니다. IoC 컨테이너를 사용하면 뷰의 다른 구현을 등록하고 동일한 팩토리 구현을 재사용 할 수 있지만 IoC 컨테이너가 없으면 각 뷰 세트에 대해 팩토리를 추가로 구현해야합니다.

그러면 부모 컨트롤러가 팩토리를 사용하여 하위 컨트롤러의 인스턴스를 만듭니다. 팩토리는 적절한 뷰가 삽입 된 자식 컨트롤러를 반환합니다. 상위 제어기는 하위 제어기에서 ShowView을 호출하여보기 만 표시하거나 하위 제어기가 작성시보기를 자동으로 표시 할 수도 있습니다.

편집 : 컨트롤러 레이어에서

: 컨트롤러/뷰 작성하는 예 공장

public interface IControllerFactory 
{ 
    TController CreateControllerAndView<TController>() 
     where TController : Controller; 
} 

public class ControllerFactory 
{ 
    // actual provider 
    private static IControllerFactory _provider; 

    // factory method 
    public static TController 
     CreateControllerAndView<TController>() where T : Controller 
    { 
     return _provider.CreateController<TController>(); 
    } 

    public static void SetProvider(IControllerFactory provider) 
    { 
     _provider = provider; 
    } 
} 

언제든지 새 컨트롤러를 만들려면, 당신은 공장을 참조하십시오

var controller = ControllerFactory.CreateControllerAndView<UserController>(); 

팩토리는 어떤 것에도 의존하지 않고 단지 정의되어 있고 아직 구현되지 않았습니다.다음 어딘가에

ControllerFactory.SetProvider(new ConcreteControllerFactory()); 

당신이 어떤 특정의 프로 바이더를 막을 수있는이 방법

public class ConcreteControllerFactory : IControllerFactory 
{ 
    public TController CreateControllerAndView<TController>() 
    { 
     // since you are in the top most layer, you know all types from 
     // underlaying layers, including controllers and views 

     // IoC would help here a lot! But without it: 

     if (typeof<TController> == typeof<UserController>) 
     { 
      IUserView view = new UIUserView(); 
      UserController c = new UserController(view); 
     } 
     ... 
    } 
} 

과 :

그런 다음, 어딘가 가장 상위 계층에, 아마 시작 프로젝트에, 당신은 구상 프로 바이더를 구현 공장, 테스트 제공자, ui 제공자, 무엇이든간에. 실제 구현은 다를 수 있지만 아이디어를 얻어야합니다.

+0

어떤 프로젝트에서 순환 종속성을 피하기 위해이 팩토리를 넣어야합니까? 또한 "부모 컨트롤러"를 사용하지 않았습니다. 이게 무슨 뜻인지 설명해 주시겠습니까? (마음에있는 것이 있습니다 만, 그것이 옳은지 나는 모르겠습니다)? –

+0

컨트롤러와 사용자 인터페이스가 정의 된 프로젝트에서 팩토리를 정의해야합니다. 팩토리의 특정 제공 업체는 솔루션의 기본 프로젝트 인 '구성 루트'에 구현되어야합니다. "부모 컨트롤러"란 부모 컨트롤러 (메인) 뷰와 연결된 컨트롤러를 말하며, "자식"컨트롤러와 대비하여 생성하려는 폼과 관련되어 있습니다. –

+0

나는 공장이 무엇인지 알지만, 공장을 제공하는 사람은 무엇이며, 공장은 무엇을 하는가? –