Ninjectを使用して、現在のユーザーを私のドメインに注入します
-
28-10-2019 - |
質問
現在の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にアップロードしました...
解決
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;
}
}
これが意味をなさない場合はお知らせください。