일반적인 함정에 빠진 것처럼 보이지만 걱정하지 마십시오. 고정 될 수 있습니다 :)
먼저 응용 프로그램을 조금 다르게보고 청크로 분할해야합니다. 청크를 두 방향으로 나눌 수 있습니다. 먼저 제어 코드 (비즈니스 규칙, 데이터 액세스 코드, 사용자 권한 코드, 모든 종류의 것들)를 UI 코드와 분리 할 수 있습니다. 두 번째로 UI 코드를 여러 덩어리로 나눌 수 있습니다.
따라서 후자를 먼저 수행하여 UI를 청크로 나눕니다. 가장 쉬운 방법은 UI를 usercontrols로 작성하는 단일 호스트 양식을 갖는 것입니다. 각 사용자 정의 컨트롤은 양식 영역을 담당합니다. 응용 프로그램에 사용자 목록이 있다고 가정하고 사용자를 클릭하면 아래의 텍스트 상자에 세부 정보가 채워집니다. 한 명의 사용자가 사용자 목록의 표시를 관리하고 두 번째 사용자가 사용자의 세부 사항 표시를 관리하도록 할 수 있습니다.
실제 트릭은 컨트롤 간의 통신을 관리하는 방법입니다. 서로 무작위로 참조를 잡고 메소드를 호출하는 양식의 30 개의 사용자 정의 컨트롤을 원하지 않습니다.
따라서 각 컨트롤에 대한 인터페이스를 만듭니다. 인터페이스에는 컨트롤이 수락 할 작업과 발생하는 이벤트가 포함됩니다. 이 앱에 대해 생각할 때 목록 상자 목록 선택이 변경 되어도 상관 없습니다. 새로운 사용자가 변경되었다는 사실에 관심이 있습니다.
따라서 예제 앱을 사용하여 사용자 목록 상자를 호스팅하는 컨트롤의 첫 번째 인터페이스에는 사용자 개체를 전달하는 UserChanged라는 이벤트가 포함됩니다.
목록 상자가 지루하고 3D 줌 매직 매직 컨트롤을 원할 경우 동일한 인터페이스로 코딩하고 연결하기 때문에 좋습니다. :)
자, 2 부, UI 논리를 도메인 논리와 분리하십시오. 글쎄, 이것은 잘 착용 된 경로이며 여기에서 MVP 패턴을 보는 것이 좋습니다. 정말 간단합니다.
각 컨트롤은 이제 View (VV에서 MVP)라고하며 위에서 필요한 대부분을 이미 다뤘습니다. 이 경우 컨트롤과 인터페이스입니다.
우리가 추가하는 것은 모델과 발표자뿐입니다.
이 모델에는 응용 프로그램 상태를 관리하는 논리가 포함되어 있습니다. 당신은 물건을 알고 있습니다, 그것은 사용자를 얻기 위해 데이터베이스로 가고, 사용자를 추가 할 때 데이터베이스에 쓰는 것입니다. 아이디어는이 모든 것을 다른 모든 것과 완전히 분리하여 테스트 할 수 있다는 것입니다.
발표자는 설명하기가 좀 더 까다 롭습니다. 모델과 뷰 사이에있는 클래스입니다. 뷰에 의해 생성되고 뷰는 앞에서 설명한 인터페이스를 사용하여 발표자에게 전달됩니다.
발표자는 자체 인터페이스를 가질 필요는 없지만 어쨌든 하나를 만들고 싶습니다. 발표자가 원하는 것을 명시 적으로 만듭니다.
따라서 발표자는 View가 사용자 목록을 얻는 데 사용할 ListOfAllUsers와 같은 메소드를 노출하거나, AddUser 메소드를 View에 놓고 발표자로부터 호출 할 수 있습니다. 나는 후자를 선호합니다. 이렇게하면 발표자가 원하는대로 목록 상자에 사용자를 추가 할 수 있습니다.
Presenter에는 CanEditUser와 같은 속성이 있으며 선택한 사용자를 편집 할 수 있으면 true를 반환합니다. 그러면 View는 알아야 할 때마다 쿼리합니다. 편집 가능한 것을 검은 색으로, 회색으로 만 읽을 수 있습니다. 기술적으로 UI에 중점을 둔 View의 결정은 사용자가 편집 가능한지 여부는 Presenter에 대한 것입니다. 발표자는 모델과 대화하기 때문에 알고 있습니다.
요약하면 MVP를 사용하십시오. Microsoft는 위에서 설명한 방식으로 MVP를 사용하는 SCSF (Smart Client Software Factory)를 제공합니다. 다른 것들도 많이합니다. 그것은 매우 복잡하고 나는 그들이 모든 것을하는 방식을 좋아하지 않지만 도움이 될 수 있습니다.