Domanda

Ho difficoltà a iniettare l'attuale LoggedOnuser nel mio livello di servizio, sto provando qualcosa di simile a Code Camp Server ma faccio fatica a capire perché il mio codice non funziona ...

La mia app: livello dell'interfaccia utente -> connesso al servizio di dominio -> collegato al livello Repo ...

Repo non è collegato all'interfaccia utente, tutto è verificato e passato dal livello DomainService ...

Il mio codice:

// Questo è dichiarato all'interno del mio servizio di dominio

public interface IUserSession
{
    UserDTO GetCurrentUser();
}

All'interno della mia applicazione Web voglio implementare questo servizio, quindi iniettarlo nel mio livello di servizio, quindi (è qui che sono bloccato):

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


}

Quello che voglio fare è: ottenere il loggedonuser dal servizio di autenticazione, tuttavia non ha funzionato, quindi ho tolto il codice ...

Leggo tutto all'interno di Global.asax come:

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

Innanzitutto: ricevo un'eccezione quando provo a consumare un servizio che utilizza Iusersession, dice che si prega di fornire un costruttore senza parametri predefinito per il controller X, tuttavia se rimuovo il riferimento dal servizio di dominio tutto funziona ...

Servizio CTOR:

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

Esiste un modo migliore/ più semplice per implementarlo?

Upate Con l'aiuto della risposta di seguito sono riuscito a farlo, ho caricato su Gituhub se qualcuno vuole sapere come l'ho fatto ...

https://gist.github.com/1042173

È stato utile?

Soluzione

Suppongo che tu stia usando il ninjecthttpapplication da quando hai sovrapposto su diplicazioni? In caso contrario, dovresti esserlo, poiché registrerà i controller per te con Ninject. Se ciò non sta accadendo, puoi ottenere l'errore che stai vedendo.

Ecco come l'ho fatto nella mia applicazione:

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

Fammi sapere se questo non ha senso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top