Использование Ninject для добавления текущего пользователя в мой домен - PullRequest
2 голосов
/ 16 июня 2011

У меня проблемы с внедрением текущего loggedonuser в мой сервисный уровень, я пытаюсь сделать что-то похожее на сервер кода лагеря, но не могу понять, почему мой код не работает ...

Мое приложение: уровень пользовательского интерфейса -> подключен к службе домена -> подключен к уровню репо ...

Репо не подключено к пользовательскому интерфейсу, все проверено, проверено и передано обратно из слоя DomainService ...

Мой код:

// Это объявлено внутри моей доменной службы

public interface IUserSession
{
    UserDTO GetCurrentUser();
}

Внутри моего веб-приложения я хочу внедрить этот сервис, а затем внедрить его в свой сервисный слой, чтобы (вот где я застрял):

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, но если я удалю ссылку из службы домена, все будет работать ...

Сервисный центр:

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

Есть ли лучший способ / более простой способ реализовать это?

UPATE с помощью приведенного ниже ответа мне удалось это сделать, я загрузил на gituhub, если кто-то хочет знать, как я это сделал ...

https://gist.github.com/1042173

1 Ответ

0 голосов
/ 16 июня 2011

Я предполагаю, что вы используете NinjectHttpApplication, так как вы переопределили OnApplicationStarted? Если нет, то вам следует это сделать, поскольку он зарегистрирует контроллеры для вас в Ninject. Если этого не происходит, вы можете получить сообщение об ошибке.

Вот как я сделал это в своем приложении:

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

дайте мне знать, если это не имеет смысла.

...