【问题标题】:How do I inject a repository into a custom MembershipProvider using AutoFac如何使用 AutoFac 将存储库注入自定义 MembershipProvider
【发布时间】:2012-02-22 14:17:01
【问题描述】:

我创建了一个自定义会员提供程序

public class MyMembership : MembershipProvider
{
    private IRepository<User> Repo;
}

我想出了如何使用 autofac 注入 MyMembership:

builder.Register(c => Membership.Provider);

但是,如果我有一个采用 IRepository 的构造函数(它只调用无参数构造函数),这将不起作用。我尝试从私有字段更改为公共属性并调用:

builder.Register(c => Membership.Provider).AutoWireProperties();

问题是,MembershipProvider 没有 Repo 属性,它只是我的类。

目前,我没有注入任何东西,只是创建了一个空的构造函数,我只是在其中创建了我的 Repo 的一个新实例。但这让测试变得更加困难。

那么,有什么方法可以使用 AutoFac 来注入我的 MyMembership,并让它使用注入的 Repo?

【问题讨论】:

  • 如何从 Membership 子类化?该类是静态的。
  • 我的错,它是 MembershipProvider,而不是我从中派生的 Membership。好收获@Jehof
  • 我有一个自定义会员提供程序类,我希望 Autofac 将其解析为 Membership.Provider,该怎么做?

标签: c# asp.net autofac


【解决方案1】:

没有。这是不可能的。

DependencyResolver 不用于提供者(角色/成员资格)等。

我创建了一个在内部使用DependencyResolver 的会员服务提供商。您需要做的就是实现IAccountRepository 并将其注册到您的容器中。

http://blog.gauffin.org/2011/09/a-more-structured-membershipprovider/

【讨论】:

    【解决方案2】:

    这是一个旧帖子,所以我将在这里发布我的解决方案,因为我自己有点挣扎。

    公共类 AutofacBootstrapperImp : AutofacBootstrapper

    在您的 autofac builder 设置中包括注册您的界面

    builder.RegisterType<YourRepo>().As<IRepository<User>>().SingleInstance();
    

    公共类 CustomMembershipProvider : MembershipProvider

    重载init方法并使用autofac作用域来解析你的类型

    private IRepository<User> Repo;
    
        public override void Initialize(string name, NameValueCollection config)
        {
            // use autoface scope to resole service
            using (var scope = AutofacBootstrapper.Container.BeginLifetimeScope())
            {
                Repo = scope.Resolve<IRepository<User>>();
            }
    
            if (config == null)
                throw new ArgumentNullException("config");
    
            // Initialize the abstract base class.
            base.Initialize(name, config);
        }
    

    【讨论】:

      【解决方案3】:

      您还应该注册IRepository&lt;User&gt;。但要做到这一点,您需要通过其具体类型访问您的自定义提供程序。

      所以是这样的:

      builder.Register( c => Membership.Provider );
      builder.Register( c => ((MyMembership) Membership.Provider).Repo );
      

      这可以做得更好(通过注册您的实现来避免强制转换),如下所示,但不确定它如何适应 ASP.NET 及其对提供程序生命周期的管理:

      builder.RegisterType<MyMembership>();
      builder.Register( c => c.Resolve<MyMembership>() ).As<MembershipProvider>();
      builder.Register( c => c.Resolve<MyMembership>().Repo );
      

      编辑:

      但从设计的角度来看,您的 MyMembership 类似乎依赖于 IRepository&lt;User&gt;,因此这样的事情可能是最好的:

      builder.RegisterType<YourRepositoryImplementation>().As<IRepository<User>>();
      builder.RegisterType<MyMembership>();
      builder.Register( c => c.Resolve<MyMembership>() ).As<MembershipProvider>();
      

      这样,IRepository 将根据需要注入到 MyMembership 中,但也可供其他组件直接使用,并且它们都具有由 Autofac 处理的生命周期管理。

      【讨论】:

      • 太棒了。我已经在其他地方注册了 IRepository 。今晚回家后,我会试试这些,谢谢。
      • 刚刚对自定义 MembershipProviders 做了一些阅读,似乎 ASP.NET 为您实例化了该实例,因此上面的最后两个选项将不起作用,至少不正确。您将拥有一个由 ASP.NET 构造的实例(由Membership.Provider 返回)和由 Autofac 构造的实例。您最好的选择可能是第一个选项。
      • Ack,但是我看到了您的问题,您希望通过 ASP.NET 构建的自定义提供程序注入已注册的 IRepository&lt;User&gt; 实例。除非 ASP.NET 为成员资格提供程序实例化提供一些挂钩,否则您可能必须在 MyMembership 构造函数中使用服务定位器反模式来解析 IRepository&lt;User&gt;
      【解决方案4】:

      这种情况是完全可能的。在我的Bootstrapper.cs 类中,我只是将属性注入到提供程序中:

              DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
      
              var lifetimeScope = DependencyResolver.Current.GetService<ILifetimeScope>();
              lifetimeScope.InjectProperties(Membership.Provider);
              lifetimeScope.InjectProperties(Roles.Provider);
      

      我还有以下:

              builder.Register(context => Membership.Provider).ExternallyOwned();
              builder.Register(context => Roles.Provider).ExternallyOwned();
      

      但是我不完全确定它是否有必要。我相信Registers 在那里,以防你想将提供者注入到一个类型中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-21
        • 2013-02-02
        • 2019-09-30
        • 1970-01-01
        • 2017-12-25
        • 2012-05-07
        • 2012-09-16
        • 1970-01-01
        相关资源
        最近更新 更多