재사용 MVC arhitecture; UI의 두 층이 있습니다 : ASP.NET MVC 및 .NET Winforms
-
02-07-2019 - |
문제
내 질문이 추상적으로 보일지 모르지만 나는 그것이 아니기를 바랍니다. 응용 프로그램, ASP.NET MVC 사이트를 개발 한 후 나중에이 응용 프로그램을 위해 WinForms 클라이언트를 구축해야한다고 가정 해 봅시다. 기존 응용 프로그램에서 얼마나 많은 시간과 어떻게 재사용 할 수 있습니까?
모델을 정의하고 컨트롤러와 뷰를 정의했습니다. 그들은 모두 잘 작동합니다.
이제 Boss는 Winforms 클라이언트를 요청하고 모델과 컨트롤러를 재사용 할 수 있기를 바라고 있습니다 (다른 어셈블리에 넣은 경우).
이 작업을 수행 할 수 있습니까? 어떻게?
해결책
ASP.NET MVC가 아니라 순수한 ASP.NET 웹 양식으로 이전에 작업을 수행했습니다. 나는 집에서 재배 한 MVP (Model-View-Presenter) 패턴을 사용했으며, 윈 포름 앱에서 발표자 (== 컨트롤러)를 사용할 수 있도록하는 가장 중요한 것은 참조하지 않는 것이 었습니다. 아무것 System.web와 관련이 있습니다
따라서 가장 먼저해야 할 일은 요청, 응답, 웹 등을 감싸기 위해 인터페이스를 소개하고 모든 발표자가 종속성 주입을 통해 이러한 인터페이스를 수락하도록하는 것입니다 (또는 다른 기술로 발표자가 제공 할 수 있도록). 발표자가 실제 시스템이 아닌이를 사용하는 경우.
예시:
컨트롤을 페이지 A에서 B 페이지로 전송한다고 상상해보십시오 (WinForms 앱에서 양식 A와 개방형 양식 B를 닫을 수 있음).
상호 작용:
public interface IRuntimeContext
{
void TransferTo(string destination);
}
웹 구현 :
public class AspNetRuntimeContext
{
public void TransferTo(string destination)
{
Response.Redirect(destination);
}
}
Winforms 구현 :
public class WinformsRuntimeContext
{
public void TransferTo(string destination)
{
var r = GetFormByName(destination);
r.Show();
}
}
이제 발표자 (귀하의 경우 컨트롤러) :
public class SomePresenter
{
private readonly runtimeContext;
public SomePresenter(IRuntimeContext runtimeContext)
{
this.runtimeContext = runtimeContext;
}
public void SomeAction()
{
// do some work
// then transfer control to another page/form
runtimeContext.TransferTo("somewhereElse");
}
}
ASP.NET MVC 구현을 자세히 보지 못했지만 이것이 시나리오를 활성화하기 위해 많은 작업이 될 것이라는 증거를 제공하기를 바랍니다.
대신 다른 플랫폼의 뷰 및 컨트롤러를 다시 코딩해야한다는 것을 고려하고 대신 컨트롤러를 극도로 얇게 유지하고 공유 할 수있는 서비스 계층에 코드의 대부분을 넣는 데 집중할 수 있습니다.
행운을 빕니다!
다른 팁
살펴보십시오 노스 윈드 스타터 키트 (Northwind 비트로 꺼지지 마십시오)- MVC 및 Winforms를 포함한 레이어드 아키텍처에 다양한 GUI가 부착되어 있습니다.
그것은 당신이 달성하고자하는 것을 정확하게 수행합니다.