我创建了一个自定义成员资格提供程序
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?
答案 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
是存在的,以防你想将提供者注入一个类型。