考慮事項
新しい 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 questionとthis 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;
}
}
}
問題なく動作しているようです。