가능한 접근법 중 하나는 컨트롤러 팩토리입니다. 팩토리는 컨트롤러와 뷰를 생성하고 둘 다 함께 연결하는 일을 담당합니다.
다른 뷰 세트에 대해 다른 구현을 가질 수 있도록 공장을 구성 할 수 있어야합니다. 실제 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 제공자, 무엇이든간에. 실제 구현은 다를 수 있지만 아이디어를 얻어야합니다.
제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –