我正在使用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);
}
}
答案 0 :(得分:3)
I blogged about how to apply IoC to providers with Windsor。这个概念本身可以移植到任何IoC容器,代码非常简单,它可以实现容器的全部功能。
答案 1 :(得分:2)
即使asp.net成员资格提供程序是静态的,您仍然可以将它们包装在一个接口中。我一直在使用的是:
然后,您将创建使用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方法)来解决依赖关系是最容易的。