使用Ninject将存储库注入自定义成员资格提供程序

Lut*_*cka 18 asp.net-mvc ninject-2 asp.net-mvc-3

我正在尝试使用MVC 3中的ninject将存储库注入自定义成员资格提供程序.

在MembershipProvider中,我尝试了以下内容:

[Inject]
public ICustomerRepository _customerRepository{ get; set; }
Run Code Online (Sandbox Code Playgroud)

[Inject]
public TUMembershipProvider(ICustomerRepository customerRepository)
{
    _customerRepository = customerRepository;
}
Run Code Online (Sandbox Code Playgroud)

在我的ninject模块中,我尝试了以下方法:

Bind<MembershipProvider>().ToConstant(Membership.Provider);
Run Code Online (Sandbox Code Playgroud)

以上都不是.

当我使用(在global.asa)

kernel.Inject(Membership.Provider);
Run Code Online (Sandbox Code Playgroud)

和...一起

[Inject]
public ICustomerRepository _customerRepository{ get; set; }
Run Code Online (Sandbox Code Playgroud)

它有效,但我没有生命周期管理,这将导致NHibernate的"ISession is open"错误,因为ISession是InRequestScope而存储库不是.

Rub*_*ink 5

您可以在他关于提供者注入的博客文章中使用@Remo Gloor概述.它涉及3个步骤:

  1. [Inject]s 添加到您需要注入的提供者的任何属性中(尽管他显示的模式 - 创建一个非常简单的类,其唯一的功能是接受属性注入,并将任何请求转发给使用构造函数注入实现的实际类)值得关注)

    public class MyMembershipProvider : SqlMembershipProvider
    {
        [Inject]
        public SpecialUserProvider SpecialUserProvider { get;set;}
        ...
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个初始化器包装器,它实现IHttpModule了拉动提供者,触发它的创建: -

    public class ProviderInitializationHttpModule : IHttpModule
    {
        public ProviderInitializationHttpModule(MembershipProvider membershipProvider)
        {
        }
    ...
    
    Run Code Online (Sandbox Code Playgroud)
  3. 注册IHttpModule您的RegisterServices: -

    kernel.Bind<IHttpModule>().To<ProviderInitializationHttpModule>();
    
    Run Code Online (Sandbox Code Playgroud)
  4. 没有4; Ninject完成剩下的工作 - IHttpModules在启动过程中自动引导所有已注册的,包括你添加的那个.

(不要忘记阅读博客文章上的评论重生时间等)


最后,如果您正在寻找完全解决问题的脑力直接解决方案,请尝试使用@Remo Gloor答案


PS对整个混乱的一个很好的写法提供者不是@Mark Seemann的模式.(以及他优秀书籍的代号插件: - .NET中的依赖注入,可以让你从第一原理中轻松地找出这些东西)


Tz_*_*Tz_ 1

问题在于整个成员资格基础结构是“本机”.NET 代码 (System.Web.Security),它不了解 MVC 以及 MVC 使用的 DI 容器。对 Membership.Provider 的静态调用根据配置返回成员资格提供程序,但是,指定的提供程序类型是通过简单的 Activator.CreateInstance 调用实例化的。因此,依赖注入没有机会启动并设置存储库对结果的依赖。如果您使用 Ninject 显式设置返回的实例,它就可以工作,因为您显式为 Ninject 提供了对象来设置依赖项。即使在这种情况下,它也只能使用属性注入,而不能使用构造函数注入,因为实例是由之前的成员资格配置创建的。

总结一下:您无法轻松地将依赖项注入成员资格提供程序,因为它不是从依赖项注入容器解析的。我认为你有两种可能性:

  1. 您可以直接在自定义成员资格提供程序中创建存储库,或者根据需要通过其他方式访问它(其中 Web 上下文已存在)。
  2. 您向上一级检查将使用您的成员资格提供程序的组件,然后尝试在那里进行更改(使用从 DI 容器解析的成员资格提供程序,而不是未初始化的 Memership.Provider)。如果这个“更高的组件”是表单身份验证,那么本文可能会有所帮助(使用 IFormsAuthentication 和 IMembershipService 的依赖注入):http ://weblogs.asp.net/shijuvarghese/archive/2009/03/12/applying- asp-net-mvc-nerddinner-com-application.aspx 中的依赖注入