JDunkerleyはそれを正しく持っています。ただし、MVPを使用して分離する方法を説明し、HeikoHatzfeldが話している設計上の問題を回避できるようにします。
基本的に、コントロールとマスターページの両方にMVPパターンを実装します。その方法については、こちらをご覧ください。マスターのインターフェース(IMasterView)で呼び出すメソッドを宣言します。次に、2つのコンポーネント間の関係を制御するクラスを作成します。これをPageControllerクラスと呼びます。global.asax.csに次の行を追加して、このクラスのインスタンスを各リクエストのリクエスト状態にします。
/* global.asax.cs */
protected void Application_BeginRequest(object sender, EventArgs e)
{
// ...
HttpContext.Current.Items["Controller"] = new PageController();
// ...
}
次に、次のコード行を使用して、各プレゼンター(マスターとコントロール)からこのインスタンスにアクセスできます。
var controller = HttpContext.Current.Items["Controller"] as PageController;
次に、イベントまたはその他のメカニズムを実装して、コントロールがこの共有オブジェクトを介して分離された方法でマスターのメソッドを呼び出せるようにすることができます。例えば:
/* 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();
}
「EventFired」イベントがコントロールのインターフェイス(IControlView)で宣言され、コントロールに実装されていることを確認してください。次に、マスターに影響を与えるために(そのメソッドを呼び出す)必要なのは、このイベントを発生させることだけで、MVP+PageContollerが残りの処理を行います。
乾杯