Pregunta

Tengo problemas para inyectar el LoggedOnuser actual en mi capa de servicio, estoy intentando algo similar al servidor de Code Camp pero que lucha por descubrir por qué mi código no funciona ...

Mi aplicación: Capa de interfaz de usuario -> Connecida al servicio de dominio -> conectado a la capa de repositorio ...

El repositorio no está conectado a la interfaz de usuario, todo se verifica verificado y se transfiere de la capa de servicio de dominios ...

Mi código:

// Esto se declara dentro de mi servicio de dominio

public interface IUserSession
{
    UserDTO GetCurrentUser();
}

Dentro de mi aplicación web quiero implementar este servicio y luego inyectarlo en mi capa de servicio (aquí es donde estoy atrapado):

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


}

Lo que quiero hacer es: obtener el LoggedOnuser del servicio de autenticación, sin embargo, eso no funcionó, así que robé el código ...

Aparo todo dentro de Global.asax como:

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

En primer lugar: recibo una excepción cuando intento consumir un servicio que usa iusersession, dice que proporciona un constructor predeterminado sin parámetros para el controlador X, sin embargo, si elimino la referencia del servicio de dominio, todo funciona ...

Servicio CTOR:

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

¿Hay una mejor manera/ forma más simple de implementar esto?

Actualizar Con la ayuda de la respuesta a continuación, logré hacer esto, he subido a Gituhub si alguien quiere saber cómo lo hice ...

https://gist.github.com/1042173

¿Fue útil?

Solución

Supongo que estás usando el NinjecThtTpApplication ya que has anulado OnApplicationsstarted. Si no, debería serlo, ya que registrará los controladores para usted con Ninject. Si eso no está sucediendo, entonces puede obtener el error que está viendo.

Así es como he hecho esto en mi aplicación:

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

Avísame si esto no tiene sentido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top