Search code examples
asp.net-mvcentity-frameworkninjectcustom-membershipprovider

How to configure Ninject for MVC4 & custom Membership provide?


According to this article description custom-membership-provider-with-repository-injection

I implement the custom Membership provide with inject.

Custom Membership provider

using Ninject;

public class CustomMembershipProvider : MembershipProvider
{
        [Inject]
        public IUserRepository UserRepository { get; set; }

[...]

Custom Role Provider

using Ninject;

public class CustomRoleProvider : RoleProvider
{
      [Inject]
      public IUserRoleRepository UserRoleRepository { get; set; }
[...]

within Web.Config

<membership defaultProvider="CustomsMembershipProvider">
      <providers>
        <clear/>
        <add name="CustomsMembershipProvider" type="namespace.CustomsMembershipProvider"/>
      </providers>
</membership>
<roleManager enabled="true" defaultProvider="customRoleProvider">
      <providers>
        <clear/>
        <add name="customRoleProvider" type="namespace.customRoleProvider"/>
      </providers>
</roleManager>

Now within NinjectWebCommon

private static IKernel CreateKernel()
{
      var kernel = new StandardKernel();
      kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
      kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

      RegisterServices(kernel);
      return kernel;
}

private static void RegisterServices(IKernel kernel)
{
  [...]

  kernel.Bind<IUserRepository>().To<UserRepository>();
  kernel.Bind<IUserRoleRepository>().To<UserRoleRepository>();

  // Inject user & role repository into our custom membership & role providers.
   kernel.Inject(Membership.Provider);
   kernel.Inject(Roles.Provider);
}

when I run application I got error

This method cannot be called during the application's pre-start initialization stage.

from kernel.Inject(Membership.Provider); this line

But If I Kernel setting put within Application_Start

I got bellow Error

Error activating IUserRepository No matching bindings are available, and the type is not self-bindable. Activation path: 2) Injection of dependency IUserRepository into property UserRepository of type CustomMembershipProvider 1) Request for CustomeMembershipProvider

How to solve that. ??


Solution

  • I had a lot of trouble trying this and ended up adding a method that gets me a repository

    using System.Web.Mvc;  //Used to access dependency resolver
    
        private IUserRepository GetUserRepository()
        {
            return DependencyResolver.Current.GetService<IUserRepository>();
        }
    

    I then call this in the methods that require it

    I was able to get the repository to become injected using constructor injection but as soon as I went to use the repository the object had been disposed. I found the above to be the simplest alternative.

    However, I guess you could also use the Initialize() method

        IUserRepository userRepository;
        public override void Initialize(string name, NameValueCollection config)
        {
            base.Initialize(name, config);
            this.userRepository = DependencyResolver.Current.GetService<IUserRepository>();
        }
    

    Or another way would be to use a property

    public IUserRepository UserRepository
    {
        get
        {
            return DependencyResolver.Current.GetService<IUserRepository>();
        }
    }