3

この質問は、主に優れた設計に関係しています。

同じコントローラーの2つの別々のビューで呼び出すことができるDeletePageのようなコントローラーアクションがあるとします。削除ロジックがアクション自体に含まれておらず、正しいビジネスロジックを呼び出す条件付きチェックなどが含まれていると仮定すると、代わりに次のようなプライベートメソッドを使用できる場合、削除アクションの構造を複製することは意味がありません。削除を引き起こす可能性のある両方のアクションで呼び出すActionResultを返します。私の質問は、このような再利用可能なアクションメソッドを配置するのに最適な場所はどこですか?今のところ、私はそれらをプライベートとしてマークし、コントローラークラスの領域に貼り付けていますが、おそらく、そのようなメソッド、または他の場所では、完全に封印された内部クラスの方が理にかなっています。

考え?

public ActionResult EditPage(int id, FormCollection formCollection)
{
    var page = _pagesRepository.GetPage(id);

    if (page == null)
        return View("NotFound");
    if (page.IsProtected)
        return View("IllegalOperation");

    if (formCollection["btnSave"] != null)
    {
        //...
    }
    else if (formCollection["btnDelete"] != null)
    {
        return DeletePage(page);
    }
    return RedirectToAction("Index");
}

public ActionResult DeletePage(int id)
{
    var page = _pagesRepository.GetPage(id);

    if (page == null)
        return View("NotFound");

    return DeletePage(page);
}

// Reusable Action
private RedirectToRouteResult DeletePage(Page page)
{
    if(page != null && !page.IsProtected)
    {
        _pagesRepository.Delete(page);
        _pagesRepository.Save();

        FlashMessage(string.Format(PageForms.PageDeleted, page.Name), MessageType.Success);

        return RedirectToAction("Index");
    }
    return RedirectToAction("Index");
}
4

3 に答える 3

4

再利用可能なメソッドをアクションメソッドにする必要がある理由がわかりません。保存の結果を示すvoid/bool / etcを返すプライベートメソッドだけでなく、パブリックアクションメソッドにRedirectToAction()を返させないのはなぜですか?事実上同じ結果ですが、より明確なアプローチだと思います。

public ActionResult DeletePage(int id)
{
        var page = _pagesRepository.GetPage(id);

        if (page == null)
                return View("NotFound");

        DeletePage(page);
        return RedirectToAction("Index");
}

//reusable method
private void DeletePage(Page page)
{
    //your same validation/save logic here
}

将来的には、このプライベートDeletePageメソッドを、検証や保存を実行する別のサービスクラスに移動することを検討する可能性があります。その場合、ActionResultを返すことは間違いなく意味がないので、この例がシナリオにとってより適切なアプローチになると思います。

于 2009-08-18T21:02:19.843 に答える
1

私の意見では、再利用可能なコードはActionResultを返すため、Actionです。だからあなたの使用は大丈夫です。はDeletePage(Page page)潜在的に公開されたままになる可能性があります。

他のご意見をお待ちしております。

于 2009-08-18T20:53:54.743 に答える
1

個人的に私はカートに同意します。保護されていないページを削除するという概念は、コントローラーが実行する必要のあるアクションから切り離す必要があります。第二に、ページが保護されているときに何が起こるかをコードから混乱させます。1つのアクションではインデックスにリダイレクトし、2番目のアクションでは「IllegalOperation」ビューにリダイレクトします。個人的にはちょっとしたことをします...

public ActionResult DeletePage(int id) {
    var page = _pagesRepository.GetPage(id);
    if (!PageIsValidForDeletion(page)) {
         string invalidPageView = FindViewForInvalidPage(page);
         return View(invalidPageView);
    }
    DeletePage(page);
    return RedirectToAction("Index");
}
于 2009-08-18T21:32:57.863 に答える