2

考慮事項

新しい MVC4 インターネット アプリケーションを作成しました。デフォルトでは、アカウント モデルに次のクラスが付属しています。

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
}

他のすべてのユーザー情報を追加し、テーブルをリンクするのに適した場所のようです。これが「基本」ユーザー クラスのように見えるため、「プロファイル」と呼ばれるという事実は、私には少し奇妙に思えます。

データベースに というテーブルがありますwebpages_Membershipが、そのモデルがどこにあるのかわかりません。OpenID を使用してアカウントを作成すると、そこにレコードが挿入されているようにも見えません。これはローカル アカウント専用だと思います。そのため、「UserProfile」だけがユーザーに保証されているようです。

とにかく、基本ControllerクラスにはProfileとして定義されたプロパティがあるように見えProfileBaseますが、デバッガーを使用して検査するSystem.Web.Profile.DefaultProfileと、それは であり、「入力」されていないようです。つまり、私がログインしている場合でも、IsAnonymous真であり、UserNameです。null

これは意図的なものだと思いますか?独自のベースコントローラーを定義することでそれをオーバーライドすることは期待されていますか?

this questionthis articleの拡張について説明ProfileBaseしていますが、そのアプローチは少し面倒です。

質問

前述のすべての考慮事項により、すべての余分なプロパティをUserProfile既に作成されているクラスに追加し、BaseControllerを拡張する新しいクラスを追加しController、プロパティをオーバーライド/新規作成して代わりProfileに a を返すことが最善のようですUserProfile(1)これは良いアプローチですか?

しばらく時間がかかりましたがUserProfile、現在ログインしているユーザーのオブジェクトを取得する方法を最終的に見つけました。

udb.UserProfiles.Single(p => p.UserName == User.Identity.Name);

(2) それはそれを得る最良の方法ですか? にはプロパティUserProfileがありUserIdますが、それを取得する方法がわかりません。(3) 現在ログインしているユーザーの UserId を取得するにはどうすればよいですか?

プロパティにプロファイルを遅延ロードさせて、そのプロパティに初めてアクセスしたときにのみデータベースにヒットするようにできると考えていました。ユーザークラス全体をjsonでシリアル化することについて話している他の記事をいくつか読んだので、ページの読み込みごとにDBにアクセスする必要はありませんが、それはさらに厄介に聞こえ、データが同期しなくなるリスクがあります.

実装

これを試してみました:

public class BaseController : Controller
{
    private UsersContext _udb = new UsersContext();
    private UserProfile _profile = null;

    public new UserProfile Profile
    {
        get
        {
            if(_profile == null && User.Identity.IsAuthenticated)
            {
                _profile = _udb.UserProfiles.Single(p => p.UserName == User.Identity.Name);
            }
            return _profile;
        }
    }
}

問題なく動作しているようです。

4

0 に答える 0