質問

現在のLoggedOnuserをサービスレイヤーに注入するのに苦労しています。コードキャンプサーバーに似たことを試みていますが、コードが機能しない理由を理解するのに苦労しています...

私のアプリ:UIレイヤー - >ドメインサービスに接続 - >レポ層に接続...

リポジトリはUIに接続されておらず、すべてが確認され、ドメインサービスレイヤーから渡されます...

私のコード:

//これは私のドメインサービス内で宣言されます

public interface IUserSession
{
    UserDTO GetCurrentUser();
}

私のWebアプリケーション内で、このサービスを実装し、それをサービスレイヤーに注入したいので(これは私が立ち往生している場所です):

public class UserSession : IUserSession
{
    //private IAuthorizationService _auth;
    public UserSession()//IAuthorizationService _auth)
    {
        //this._auth = _auth;
    }

    public UserDTO GetCurrentUser()
    {
        var identity = HttpContext.Current.User.Identity;
        if (!identity.IsAuthenticated)
        {
            return null;
        }
        return null;
        //return _auth.GetLoggedOnUser(identity.Name);
    }


}

私がやりたいのは、認証サービスからLoggedOnuserを入手することですが、それは機能しなかったので、コードを突き刺しました...

私はすべてをglobal.asaxのようにバインドします:

protected override void OnApplicationStarted()
    {
        AreaRegistration.RegisterAllAreas();
        // hand over control to NInject to register all controllers
        RegisterRoutes(RouteTable.Routes);
        Container.Get<ILoggingService>().Info("Application started");
       //here is the binding...
        Container.Bind<IUserSession>().To<UserSession>();
    }

まず、iUsersessionを使用するサービスを消費しようとすると例外を取得しています。コントローラーXにデフォルトのパラメーターレスコンストラクターを提供してください。ただし、ドメインサービスから参照を削除すると、すべてが機能します...

サービスCTOR:

 private IReadOnlyRepository _repo;
    private IUserSession _session;
    public ActivityService(IReadOnlyRepository repo, IUserSession _session)
    {
      this._repo = repo;
      this._session = _session;
     }

これを実装するより良い方法/よりシンプルな方法はありますか?

アップテート 以下の返信の助けを借りて、私はこれを成し遂げることができました、私がそれをどのようにしたかを知りたい人がGituhubにアップロードしました...

https://gist.github.com/1042173

役に立ちましたか?

解決

onapplicationStartをオーバーライドしたので、ninjecthttpapplicationを使用していると思いますか?そうでない場合は、ninjectでコントローラーを登録するため、そうする必要があります。それが起こっていない場合は、表示されているエラーを取得できます。

アプリケーションでこれを行った方法は次のとおりです。

コントローラベース:

    [Inject]
    public IMembershipProvider Membership { get; set; }

    public Member CurrentMember
    {
        get { return Membership.GetCurrentUser() as Member; }
    }

imembershipprovider:

    public Member GetCurrentUser()
    {
        if ( string.IsNullOrEmpty( authentication.CurrentUserName ) )
            return null;

        if ( _currentUser == null )
        {
            _currentUser = repository.GetByName( authentication.CurrentUserName );
        }
        return _currentUser;
    }
    private Member _currentUser; 

iauthenticationProvider:

    public string CurrentUserName
    {
        get
        {
            var context = HttpContext.Current;
            if ( context != null && context.User != null && context.User.Identity != null )
                return HttpContext.Current.User.Identity.Name;
            else
                return null;
        }
    }

これが意味をなさない場合はお知らせください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top