是否可以使用IOC容器来实例化自定义MembershipProvider?

时间:2011-01-23 18:35:27

标签: asp.net-mvc asp.net-membership ioc-container autofac

我正在使用Autofac和ASP.NET MVC,所以我的所有控制器都很好地解决了它们的依赖关系。但我有一个自定义成员资格提供程序,有两个依赖项。我怀疑实例化成员资格提供程序的代码在ASP.NET中很远,距离Autofac很远。

有没有办法让Autofac解析我的自定义会员提供商?

我假设调用类似.Resolve的东西

这是成员资格提供者及其构造函数:

public class MongoDBMembershipProvider : MembershipProvider
{
    private IEmailService m_oEmailService;
    private IUserRepository m_oUsers;

    public MongoDBMembershipProvider() {
    }

    public MongoDBMembershipProvider( IEmailService oEmailservice, IUserRepository oUserRepository) {
        m_oEmailService = oEmailservice;
        m_oUsers = oUserRepository;
    }

    public override void Initialize( string name, NameValueCollection config) {
        //TODO: Let Autofac do this work... how?
        m_oEmailService = new EmailService();
        m_oUsers = new Users();
    }

    public override bool ValidateUser( string sUsername, string sPassword) {
        return m_oUsers.ValidateAttemptedLogon( sUsername, sPassword);
    }

    public override string GetUserNameByEmail( string sEmailAddress) {
        return m_oUsers.GetUsernameByEmail( sEmailAddress);
    }
}

4 个答案:

答案 0 :(得分:3)

I blogged about how to apply IoC to providers with Windsor。这个概念本身可以移植到任何IoC容器,代码非常简单,它可以实现容器的全部功能。

答案 1 :(得分:2)

即使asp.net成员资格提供程序是静态的,您仍然可以将它们包装在一个接口中。我一直在使用的是:

http://gpsnerd.codeplex.com/SourceControl/changeset/view/03279dbfcef5#Infrastructure%2fMembership%2fIMembershipService.cs

然后,您将创建使用asp.net成员资格的此接口的实现。然后你可以让你的ioc将这个接口绑定到实现。通过提取出这个界面,现在你可以使用假的来测试你的代码。

鲍勃

答案 2 :(得分:1)

这是我的猜测......

首先,删除你不需要的初始化方法。

var builder = new ContainerBuilder();

builder.Register<EmailService>().As<IEmailService>();
builder.Register<Users>().As<IUserRepository>();
builder.Register<MongoDBMembershipProvider>().As<MembershipProvider>();

//something like this
MembershipProvider provider;
using (var container = builder.Build())
{
    provider = container.Resolve<MembershipProvider>();
}

这里的其他人都告诉过你如何将它带入运行时的想法...

答案 3 :(得分:0)

我认为你是正确的,因为成员资格提供程序是在ASP.NET内部实例化的。我认为从构造函数中删除接口并调用Resolve(或任何适当的Autofac方法)来解决依赖关系是最容易的。