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 パラダイムで最初のコードをリファクタリングする最良の方法はどれですか?
ありがとうございました