Внедрение зависимости с пользовательским поставщиком членства

У меня есть веб-приложение MVC ASP.NET, которое реализует пользовательского поставщика членства. Пользовательский поставщик членства берет a UserRepository его конструктору, который обеспечивает интерфейс между поставщиком членства и NHibernate. UserRepository обеспечивается контейнером МОК Ninject.

Очевидно, однако, это не работает, когда поставщик инстанцирует.NET: конструктор без параметров не имеет UserRepository и не может создать один (UserRepository требует, чтобы сессия NHibernate была передана ее конструктору), который затем означает, что поставщик не может получить доступ к ее хранилищу данных. Как я могу разрешить свою зависимость объекта?

Вероятно, стоит отметить, что это - существующее приложение, которое было модифицировано с Ninject. Ранее я использовал конструкторов без параметров, которые смогли создать их необходимые зависимости в сочетании с параизмеренными конструкторами для помощи поблочному тестированию.

Какие-либо мысли, или я встроил меня в угол здесь?

11
задан alastairs 2 May 2010 в 12:19
поделиться

2 ответа

Возможно, вы захотите оставить конструктор без параметров, который инициализирует необходимые хранилища с помощью Ninject. Возможно, вы захотите использовать Common Service Locator, так что вам не нужно будет иметь ни ссылку на Ninject, ни его контейнер внутри вашего пользовательского провайдера. Кажется, Ninject не имеет официальной реализации адаптера для CSL, но написать его не должно быть сложно (проверьте другие реализации, например, Windsor's), и я уверен, что где-то есть неофициальная реализация.

5
ответ дан 3 December 2019 в 08:54
поделиться

У меня была та же проблема, я решил ее, передав требуемые данные с помощью аутентификационного билета в объект identity.

Тогда не нужно инжектировать объекты в провайдеры членства.

В моем коде аутентификации есть

    [NonAction]
    private void SetAuthTicket(Member member, bool isPersistent)
    {
        HttpCookie cookie = Request.Cookies.Get(FormsAuthentication.FormsCookieName);

        FormsAuthentication.SetAuthCookie(member.Email, isPersistent);

        string userData = "|" + member.ID + "|" + member.Firstname + "|" + member.Lastname + member.Culture;

        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, member.Email, DateTime.UtcNow, DateTime.UtcNow.AddDays(7), isPersistent, userData);

        string encryptedTicket = FormsAuthentication.Encrypt(ticket);
        cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
        Response.Cookies.Add(cookie);
    }

И в Global.asax

    void Application_OnPostAuthenticateRequest(object sender, EventArgs e)
    {
        IPrincipal user = HttpContext.Current.User;
        if (user.Identity.IsAuthenticated && user.Identity.AuthenticationType == "Forms")
        {
            FormsIdentity identity = user.Identity as FormsIdentity;

            MyIdentity ai = new MyIdentity(identity.Ticket);            
            MyPrincipal p = new MyPrincipal(ai);

            HttpContext.Current.User = p;
            System.Threading.Thread.CurrentPrincipal = p;

            if (!String.IsNullOrEmpty(ai.Culture))
            {
                CultureInfo ci = new CultureInfo(ai.Culture);
                System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
                System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);
            }
        }
    }

И в классе Identity у меня есть свойства MemberName, Firstname и Lastname, которые возвращают части строки билета.

-1
ответ дан 3 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: