2011-07-15 7 views
0

ユーザーがnullで、ユーザーがnullであることを知ることなく、アプリケーション全体で(Controllers、HtmlHelpers、およびその他のヘルパークラス)のログインユーザーにグローバルにアクセスできるようにします。ゲスト(ログインしていないユーザー)を処理する機能ログインユーザーにグローバルにアクセスするための良い方法

これは私のUsersRepository内で処理する必要がありますか?もしそうなら、どのように?それとも良い方法がありますか?

+2

私は静的コンテキストを使用しています - > http://stackoverflow.com/questions/3964989/how-to-pass-current-user-information-to-all-layers-in-ddd/3969014#3969014 –

答えて

0

すべてのリクエスト(グローバルフィルタとして登録)で実行されるカスタムアクションフィルタを作成できます。このフィルタは、ユーザのリポジトリからユーザをロードし、httpコンテキスト(たとえば、ViewData)に配置します。

EDIT:

[OK]を、フィルタのコードは(この場合には、それはViewDataをコレクションにユーザーをロードする)このようになります。ここでは匿名ユーザーは考慮しませんでした。

public class LoadUserToViewDataAttribute : ActionFilterAttribute 
{ 
    private IUserRepository _userRepository; 

    public LoadUserToViewDataAttribute(IUserRepository userRepository) 
    { 
     _userRepository = userRepository; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var controller = filterContext.Controller; 
     var userName = filterContext.HttpContext.User.Identity.Name; 
     var user = _repository.GetUser(userName); 

     controller.ViewData.Add("CurrentUser", user); 
    } 
} 
+0

Iこのアプローチのように、どのような例をしてください? –

1

カスタムアイデンティティクラスとプリンシパルクラスを作成できます。カスタムアイデンティティクラスは、現在使用しているものを拡張することができ、必要な追加情報を簡単に追加できます。

グローバルアクションフィルタでは、現在のプリンシパルをカスタマイズしたプリンシパルで上書きします。次に、通常のIDのようなどこからでもアクセスできますが、追加情報が必要な場合は、カスタムIDクラスにキャストするだけです。これにより、あなたの追加情報へのアクセスが許可されます。

関連する問題