可能的方法之一涉及控制器工廠。工廠負責創建控制器和視圖並將它們連接在一起。
工廠應該是可配置的,因此您可以針對不同的視圖設置不同的實現 - 用於構建實際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>();
請注意,工廠不依賴於任何東西,它只是定義,尚未實現。
然後,地方在最上層,在可能啓動項目,你實現一個具體提供者:
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);
}
...
}
}
,然後某處
ControllerFactory.SetProvider(new ConcreteControllerFactory());
這樣你可以將任何特定的供應商到工廠,測試提供商,ui提供商,無論如何。實際的實施可能會有所不同,但你應該明白。
我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –