1

WebformsMVP フレームワークを使用して、Webforms アプリケーションを Model-View-Presenter (MVP) にリファクタリングしようとしています。プレゼンターを作成し、ビュー コードを調整しているときに、一部のサブコントロールのデータを動的に埋める 1 つのビューに出くわしました。私が取り組んでいるビューのリファクタリングされていないバージョンのコードビハインドは次のとおりです。

[PresenterBinding(typeof(OrderDetailsPresenter))]
public partial class OrderDetails : AuthorizedPageBase<OrderDetailsPage>, IOrderDetails
{
    private PurchaseOrder _orderDetail;

    private int _orderGroupId;

    protected new void Page_Load(object sender, EventArgs e)
    {
        base.Page_Load(sender, e);

        _orderGroupId = string.IsNullOrEmpty(Request.QueryString["po"])
            ? _orderGroupId = 0
            : _orderGroupId = Int32.Parse(Request.QueryString["po"].ToString(CultureInfo.InvariantCulture));

        _orderDetail = OrderContext.Current.GetPurchaseOrder(SecurityContext.Current.CurrentContactId, _orderGroupId);

        if (_orderDetail == null)
            return;

        if (_orderDetail.OrderForms[0].Shipments.Count > 1)
        {
            var control = (OrderDetailsMultiShipment)LoadControl("~/Templates/Sample/Units/AccountManagement/OrderDetailsMultiShipment.ascx");
            control.OrderDetail = _orderDetail;
            modulePlaceHolder.Controls.Add(control);
        }
        else
        {
            var control = (OrderDetailsSingleShipment)LoadControl("~/Templates/Sample/Units/AccountManagement/OrderDetailsSingleShipment.ascx");
            control.OrderDetail = _orderDetail;
            modulePlaceHolder.Controls.Add(control);
        }

    }
}

ご覧のとおり、値に応じて、1 つのコントロールまたは別のコントロールに複数の情報が読み込まれます。私の考えは次のとおりです。

  • PurchaseOrder プロパティをプレゼンターに移動する
  • Page_Load からできるだけ多くのロジックを移動してみてください
  • コントロールをプレーンにリファクタリングし、OrderDetail 属性を入力しないようにします (私にとって最も紛らわしい問題です)。

これらの問題を解決するために次のアプローチを試しました(プレゼンターがデータを入力し、ビューによってチェックされるイベントを作成します):

[PresenterBinding(typeof(OrderDetailsPresenter))]
public partial class OrderDetails : AuthorizedPageBase<OrderDetailsPage>, IOrderDetails
{
    public event EventHandler<GetShipmentsArgs> GetShipments;

    protected new void Page_Load(object sender, EventArgs e)
    {
        base.Page_Load(sender, e);

        var args = new GetShipmentsArgs();
        GetShipments(this, args);

        if (args.Shipments.Count > 1)
        {
            var control = (OrderDetailsMultiShipment)LoadControl("~/Templates/Sample/Units/AccountManagement/OrderDetailsMultiShipment.ascx");
            control.OrderDetail = _orderDetail; //Here I duplicate the problem I tried to solve...
            modulePlaceHolder.Controls.Add(control);
        }
        else
        {
            var control = (OrderDetailsSingleShipment)LoadControl("~/Templates/Sample/Units/AccountManagement/OrderDetailsSingleShipment.ascx");
            control.OrderDetail = _orderDetail; //Here I duplicate the problem I tried to solve...
            modulePlaceHolder.Controls.Add(control);
        }
    }

はい、コードがコンパイルされないことはわかっていますが、私の考えが明確になることを願っています。私のアプローチにはまだいくつかの問題があります。

プレゼンター間のコミュニケーションのシステムを考えましたが、それが最善の解決策かどうかはわかりません。MVP パラダイムで最初のコードをリファクタリングする最良の方法はどれですか?

ありがとうございました

4

0 に答える 0