11

我有一个实现自定义成员资格提供程序的 ASP.NET MVC Web 应用程序。自定义成员资格提供程序接受UserRepository其构造函数,该构造函数提供成员资格提供程序和 NHibernate 之间的接口。由UserRepositoryNinject IoC 容器提供。

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

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

有什么想法,还是我在这里把自己建在一个角落里?

4

4 回答 4

5

您可能希望保留使用 Ninject 初始化所需存储库的无参数构造函数。您可能想要使用Common Service Locator,因此您既不需要引用 Ninject 也不需要它的自定义提供程序中的容器。似乎 Ninject 没有针对 CSL 的官方适配器实现,但编写一个应该不难(检查其他实现,如 Windsor 的),我确信某处有一个非官方的实现。

于 2010-05-02T14:18:01.797 回答
5

Michael B. 的正确答案来自:Dependency injection and ASP.Net Membership Providers

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

public IRepository Repository { get { return DependencyResolver.Current.GetService(IRepository ); } }
于 2012-12-12T12:05:17.943 回答
4

由于成员资格集合和 MemberShip.Provider 实例是在 Ninject 实例化它们之前创建的,因此您需要对对象执行创建后激活。如果您在提供程序类中为您的属性使用 [Inject] 标记您的依赖项,则可以调用 kernel.Inject(MemberShip.Provider) - 这会将所有依赖项分配给您的属性。

于 2010-11-08T13:46:04.083 回答
-1

我有同样的问题,我通过使用身份验证票将所需数据传递给身份对象来解决它。

然后不需要将对象注入成员提供程序。

在我的身份验证代码中,我有

    [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 属性,它们返回票证字符串的一部分。

于 2010-05-02T12:24:13.470 回答