【问题标题】:Is it possible to use an IOC container to instantiate a custom MembershipProvider?是否可以使用 IOC 容器来实例化自定义 MembershipProvider?
【发布时间】:2023-03-30 06:33:01
【问题描述】:

我将 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);
    }
}

【问题讨论】:

  • 为什么你的默认构造函数不初始化 emailservice 和 users 类?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    鲍勃

    【讨论】:

    • 啊,是的,谢谢,你是对的。标准的 ASP.NET MVC 新项目已经这样做了,所以我将依赖项添加到控制器,然后将它们传递给 AccountMembershipService 的构造函数。然后将使用依赖项的代码从控制器移到 AccountMembershipService 类中。这对我有帮助,我现在有更大的问题要解决......
    【解决方案3】:

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

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

    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>();
    }
    

    这里的每个人都告诉过你一些关于如何将它放入运行时的想法...

    【讨论】:

    • 啊这很有趣,今晚我会在家里试一试。谢谢
    • 你还有这个问题吗?
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多