如何使用AutoFac将存储库注入自定义MembershipProvider

时间:2012-02-22 14:17:01

标签: c# asp.net autofac

我创建了一个自定义成员资格提供程序

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?

4 个答案:

答案 0 :(得分:2)

没有。这是不可能的。

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

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

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

答案 1 :(得分:2)

这是一篇很老的帖子,所以我会在这里发布我的解决方案,因为我自己也有点挣扎。

公共类AutofacBootstrapperImp:AutofacBootstrapper

在autofac构建器设置中包含接口注册

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

答案 2 :(得分:1)

您还应该注册IRepository<User>。但要做到这一点,您需要按其具体类型访问自定义提供程序。

这样的事情:

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<User>,因此这样的事情可能是最好的:

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

这样,IRepository将根据需要注入MyMembership,但也可供其他组件直接使用,并且所有这些都由Autofac处理终身管理。

答案 3 :(得分:0)

这种情况完全有可能。在我的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();
然而,我并不完全确定它是否有必要。我相信Register是存在的,以防你想将提供者注入一个类型。

相关问题