如何使用Ninject注入asp.net(mvc2)自定义成员资格提供程序?

时间:2010-06-03 05:58:58

标签: asp.net asp.net-mvc-2 ninject custom-membershipprovider

好的,所以我一直在努力工作几个小时。我在这里发现了几个帖子,但实际上没有解决问题。那么,让我再试一次......

我有一个使用Ninject和自定义成员资格提供程序的MVC2应用程序。

如果我尝试使用ctor注入提供程序,我会收到一个错误:'没有为此对象定义无参数构造函数。'

public class MyMembershipProvider : MembershipProvider
{
    IMyRepository _repository;

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

我也一直在玩工厂和Initialize(),但一切都空白了。

有什么想法/例子吗?

3 个答案:

答案 0 :(得分:5)

成员资格提供程序模型只能在具有默认构造函数的情况下实例化已配置的提供程序。您可以使用服务定位器模式尝试此操作,而不是使用依赖注入。例如:

public class MyMembershipProvider : MembershipProvider
{
    IMyRepository _repository;

    public MyMembershipProvider()
    {
        // This example uses the Common Service Locator as IoC facade, but
        // you can change this to call NInject directly if you wish.
        _repository = ServiceLocator.Current.GetInstance<IMyRepository>;
    }

答案 1 :(得分:1)

这就是我能够做到这一点的方式:

1)我为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)这是我的会员覆盖:

    public class FooMembershipProvider : MembershipProvider
    {
        private IFooRepository _FooRepository;

        public FooMembershipProvider()
        {
            NinjectHelper.Kernel.Inject(this);
        }

        [Inject]
        public IFooRepository Repository 
        { 
            set
            {
                _FooRepository = value;
            }
        }
        ...

使用这种方法,实例化成员资格提供程序并不重要。

答案 2 :(得分:1)

我在书中的完全相同的位置遇到了同样的问题。直到后来书中我才注意到有两个单独的web.config文件。我最初将我的connectionString键放在错误的web.config文件中。直到我将connectionString放在正确的web.config文件中,“无参数构造函数”错误才消失。