ベース コントローラー、アプリ サービス、リポジトリ デザインを実装しようとしています。私はこのレベルの OO 設計は初めてですが、ほぼ完成しています。残りのハードルは、ベース コントローラーの拡張を処理する方法です。
私の目標:
- 独自に立つことができるベースコントローラーを持っています...つまり、特定のコントローラーをそれから継承させることができますが、それ自体は空にして機能させることができます。
- ベース コントローラーを拡張する必要がある場合は、特定のコントローラーで拡張できます。
ここに私が持っているものがあります:
ベースコントローラー:
public class BaseControllerSingle<TRepository, TViewModelSingle> : BaseController
...
// GET: /InventoryMgmt/ManageItems/Edit/5
public virtual ActionResult Edit(
int id = 0,
string pageTitleNoun = "",
Expression<Func<TRepository, bool>> predicate = null
)
{
TViewModelSingle viewModelSingle = new TViewModelSingle();
ViewBag.Mode = "EDIT";
if (id == 0) //Add new company mode
{
viewModelSingle = _baseAppServSingle.CreateNewViewModel(CurrentUserId);
ViewBag.Header = "Create New " + pageTitleNoun;
ViewBag.Mode = "NEW";
return View(viewModelSingle);
}
//else edit existing record mode
viewModelSingle = _baseAppServSingle.CreateEditViewModel(id, predicate);
ViewBag.Header = "Edit " + pageTitleNoun;
return View(viewModelSingle);
}
そして、私の特定のコントローラー。このコードは正しくないことに注意してください (具体的には「ItemViewModel viewModel = actionResult(ItemViewModel);」...しかし、アクション結果からビューモデルを抽出し、さらに操作してから返すという、私が試みていることを示そうとしていますそれ。
public class ManageItemsController : BaseController
...
// GET: /InventoryMgmt/ManageItems/Edit/5
public ActionResult Edit(int id = 0)
{
ActionResult actionResult = GetBaseControllerSingle().Edit(
"Material",
id,
x => x.Id == id && x.CompanyId == CurrentCompanyId);
ItemViewModel viewModel = actionResult(ItemViewModel);
if (id == 0)
{
viewModel = _manageItemsAppServ.CreateNewViewModel(viewModel, CurrentCompanyId);
}
viewModel.DDLOptions = _manageItemsAppServ.CreateFilterOptionsViewModel(CurrentCompanyId);
return View(viewModel);
}