JDunkerley ma to prawo. Ale pozwól mi wyjaśnić, jak rozdzielić go za pomocą MVP, abyś mógł pracować nad unikaniem kwestii projektowej, o której mówi Heiko Hatzfeld.
Zasadniczo zaimplementuj wzorzec MVP dla kontrolki i strony wzorcowej. Aby uzyskać instrukcje, jak to zrobić, patrz here. Deklaracja metody, którą chcesz wywołać w interfejsie master (IMasterView). Następnie utwórz klasę, która będzie kontrolować relację między dwoma komponentami; nazwiemy to klasą PageController. Umieść instancję tej klasy w stanie żądania dla każdego żądania, dodając następujący wiersz do pliku global.asax.CS:
/* global.asax.cs */
protected void Application_BeginRequest(object sender, EventArgs e)
{
// ...
HttpContext.Current.Items["Controller"] = new PageController();
// ...
}
Następnie można uzyskać dostęp do tej instancji z każdego z prezenterów (master i kontrolnych) poprzez następujący wiersz kodu:
var controller = HttpContext.Current.Items["Controller"] as PageController;
Następnie można wdrożyć zdarzenie lub inny mechanizm do zezwól kontrolce na wywołanie metody na systemie głównym w sposób niezwiązany z tym wspólnym obiektem. Na przykład:
/* PageController.cs */
public event EventHandler SomeEvent;
protected virtual void OnSomeEvent(EventArgs e)
{
Debug.Assert(null != e);
var handler = this.SomeEvent;
if (null != handler)
handler(this, e);
}
public void FireSomeEvent()
{
this.OnSomeEvent(EventArgs.Empty);
}
/* ControlPresenter.cs */
public ControlPresenter(IControlView view)
: base()
{
view.EventFired += (sender, e) =>
{
var controller = HttpContext.Current.Items["Controller"] as PageController;
controller.FireSomeEvent();
};
}
/* MasterPresenter.cs */
public MasterPresenter (IMasterView view)
: base()
{
var controller = HttpContext.Current.Items["Controller"] as PageController;
controller.SomeEvent += (sender, e) => view.MyFunction();
}
Upewnij się, że „EventFired” zdarzenie jest zadeklarowane w interfejsie kontrolą użytkownika (IControlView) i wdrażane w sterowaniu. Wtedy wszystko, co musisz zrobić, aby wpłynąć na mistrza (zadzwoń do jego metody), to odpal to wydarzenie, a MVP + PageContoller zajmie się resztą.
Cheers
Użyłem tego podejścia i wszystko działało dobrze! Dzięki –
Cieszę się, że mogę pomóc! Wesołe kodowanie :-) –