代码之家  ›  专栏  ›  技术社区  ›  alastairs

使用自定义成员资格提供程序的依赖项注入

  •  11
  • alastairs  · 技术社区  · 16 年前

    我有一个ASP.NET MVC web应用程序,它实现了一个自定义成员资格提供程序。自定义成员资格提供程序接受 UserRepository 用户存储库 由Ninject IoC容器提供。

    但是,当提供程序由.NET实例化时,显然这不起作用:无参数构造函数没有UserRepository,因此无法创建UserRepository(UserRepository要求将NHibernate会话传递给其构造函数),这意味着提供程序无法访问其数据存储。如何解决对象依赖关系?

    可能值得注意的是,这是一个使用Ninject改进的现有应用程序。之前,我使用了无参数构造函数,这些构造函数能够与参数化构造函数一起创建所需的依赖项,以帮助单元测试。

    4 回复  |  直到 16 年前
        1
  •  5
  •   SztupY    16 年前

    您可能希望保留无参数构造函数,该构造函数使用Ninject初始化所需的存储库。你可能想用 Common Service Locator

        2
  •  5
  •   Community Mohan Dere    8 年前

    Dependency injection and ASP.Net Membership Providers

    您可以通过以下方式获得存储库(或服务)注入:

    public IRepository Repository { get { return DependencyResolver.Current.GetService(IRepository ); } }
    
        3
  •  4
  •   Ian Davis    15 年前

        4
  •  -1
  •   Daniil Harik    16 年前

    我也遇到了同样的问题,我通过使用身份验证票证将所需的数据传递给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属性,它们返回票证字符串的一部分。