Search code examples
asp.netasp.net-mvc-2ninjectcustom-membershipprovider

How can you inject an asp.net (mvc2) custom membership provider using Ninject?


OK, so I've been working on this for hours. I've found a couple of posts here, but nothing that actually resolves the problem. So, let me try it again...

I have an MVC2 app using Ninject and a custom membership provider.

If I try and inject the provider using the ctor, I get an error: 'No parameterless constructor defined for this object.'

public class MyMembershipProvider : MembershipProvider
{
    IMyRepository _repository;

    public MyMembershipProvider(IMyRepository repository)
    {
        _repository = repository;
    }

I've also been playing around with factories and Initialize(), but everything is coming up blanks.

Any thoughts/examples?


Solution

  • This is how I was able to do this:

    1) I created a static helper class for Ninject

    public static class NinjectHelper
    {
        public static readonly IKernel Kernel = new StandardKernel(new FooServices());
    
        private class FooServices : NinjectModule
        {
            public override void Load()
            {
                Bind<IFooRepository>()
                    .To<EntityFooRepository>()
                    .WithConstructorArgument("connectionString",
                        ConfigurationManager.ConnectionStrings["FooDb"].ConnectionString);
            }
        }
    }
    

    2) Here is my Membership override:

        public class FooMembershipProvider : MembershipProvider
        {
            private IFooRepository _FooRepository;
    
            public FooMembershipProvider()
            {
                NinjectHelper.Kernel.Inject(this);
            }
    
            [Inject]
            public IFooRepository Repository 
            { 
                set
                {
                    _FooRepository = value;
                }
            }
            ...
    

    With this approach it doesn't really matter when the Membership provider is instantiated.