Question

J'ai du mal à injecter l'utilisateur actuellement connecté dans ma couche de service, j'essaie quelque chose de similaire au serveur de code camp mais j'ai du mal à comprendre pourquoi mon code ne fonctionne pas ...

Mon application: couche UI -> connectée au service de domaine -> connectée à la couche Repo ...

Repo n'est pas connecté à l'interface utilisateur, tout est vérifié, vérifié et renvoyé depuis la couche DomainService ...

Mon code:

// Ceci est déclaré dans mon service de domaine

public interface IUserSession
{
    UserDTO GetCurrentUser();
}

Dans mon application Web, je souhaite implémenter ce service puis l'injecter dans ma couche de service (c'est là que je suis bloqué):

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);
    }


}

Ce que JE VEUX faire est: obtenir l'utilisateur connecté du service d'authentification, mais cela n'a pas fonctionné, j'ai donc supprimé le code ...

Je lie tout dans global.asax comme:

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>();
    }

Premièrement: je reçois une exception lorsque j'essaie de consommer un service qui utilise IUserSession, il est dit de fournir un constructeur sans paramètre par défaut pour le contrôleur x, mais si je supprime la référence du service de domaine, tout fonctionne ...

Service ctor:

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

Existe-t-il un meilleur moyen / un moyen plus simple de mettre en œuvre cela?

METTRE À JOUR avec l'aide de la réponse ci-dessous, j'ai réussi à faire cela, j'ai téléchargé sur gituhub si quelqu'un veut savoir comment je l'ai fait ...

https://gist.github.com/1042173

Était-ce utile?

La solution

Je suppose que vous utilisez NinjectHttpApplication depuis que vous avez remplacé OnApplicationStarted?Sinon, vous devriez l'être, car il enregistrera les contrôleurs pour vous avec Ninject.Si cela ne se produit pas, vous pouvez obtenir l'erreur que vous voyez.

Voici comment j'ai procédé dans mon application:

ControllerBase:

    [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;
        }
    }

faites-moi savoir si cela n'a pas de sens.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top