0

これが重複の可能性がある場合はお詫びします。私はあらゆる場所を調べましたが、答えが見つかりませんでした。

私の質問は、「ベストプラクティス/慣習」のようなものです。

だからここに私の状況があります、私は AccountController を持っています->次のようなものです:

    public AccountController(IAuthenticationHelper authHelper, 
                             IAccountService accountService)
    {
        _authHelper     = authHelper;
        _accountService = accountService;
    }

私の _Layout ビューには、現在ログインしているアカウントのプレースホルダーがあります。現在ログインしているアカウントを取得するために、現在のユーザー ID を HttpContext から取得しています (これはラッパー クラスにあるため、単体テストを実行できます) -> 次に、DB からアカウントの詳細を取得しています。

ここに私の質問があります。このデータが必要です。_Layout では、アカウント モデルを期待して部分ビューを実行できます -> _Layout に配置します...そして、ここで行き詰まります。アイデアが気に入らないデータベースへの非常に多くの旅行の中で、すべてのアクション内からこの小さな詳細について考えなければならないという事実が好きではありませんか? ここで何かが足りないのですか、これは間違っていると思いますか? コンセプトを間違えましたか?これを行う正しい方法は何ですか? (できればテスト可能な方法で)。

助けていただければ幸いです。

編集:必要に応じて、より多くのコードを提供させていただきます。

4

2 に答える 2

2

Child actionsそれを達成するために使用できます。たとえば、現在ログに記録されているユーザーの詳細を取得する専用の特定のコントローラーを用意し、それらを部分ビューに渡します。

public class UserInfoController: Controller
{
    [ChildActionOnly]
    public ActionResult Index()
    {
        var model = new UserDetailsViewModel();
        if (User.Identity.IsAuthenticated)
        {
            string username = User.Identity.Name;
            // fetch the user info from the database and populate your view model
            // consider caching this information to avoid multiple round-trips 
            // to the database
        }

        return PartialView(model);
    }
}

もちろん、ユーザー情報を表示するための対応する部分ビューがあります。

_Layout から、この子アクションをレンダリングできます。

@Html.Action("Index", "UserInfo")

もちろん、データベースへの複数回の往復を避けるために、この情報を単純にキャッシュすることもできます。

これで、メイン アクションとモデルは、この共通機能について心配する必要がなくなりました。これは、子アクションによって処理されます。明らかに、依存性注入を使用してUserInfoController、完全に単体テスト可能にする可能性があります。

于 2013-01-27T14:36:58.910 に答える
1

通常、ログイン後、関連するアカウントの詳細をSession. はすべてのビューで使用できるためSession、そこから参照できます。必要に応じて、共通のビュー モデルから派生させ、コントローラーをカスタム コントローラー ベースから派生させることもできます。OnActionExecuted次に、共通ビュー モデルのユーザー関連部分に、データベースから、Sessionまたはデータベースから直接、アカウントの詳細を入力するために使用できます。

于 2013-01-27T14:34:44.800 に答える