2012-02-21 67 views
4

我有一个使用Autofac和自定义成员资格提供程序的MVC3应用程序。如何使用Autofac注入asp.net mvc3自定义成员资格提供程序?

如果我尝试使用ctor注入提供程序,则会出现错误:'没有为此对象定义无参数的构造函数。

public class MyMemberShipProvider : MembershipProvider 
    { 

     IUserRepository userRepository; 

    public MyMemberShipProvider(IUserRepository userRepository) 
     { 
      this.userRepository = userRepository; 

     } 
+0

你可以使用我的自定义会员供应商,照顾你的管道:http://blog.gauffin.org/2011/09/a-more-structured-membershipprovider/ – jgauffin 2012-02-21 14:00:00

+0

谢谢,很好的教程。 – tobias 2012-02-21 15:47:07

回答

7

您无法注入内置提供程序(Membership/Roles)。 您可以使用MVC 3 DependencyResolver和Autofac。

一个简单的例子...

public override bool ValidateUser(string username, string password) 
{ 
    var userRepo = DependencyResolver.Current.GetService<IUserRepository>(); 
    return userRepo.ValidateUser(username, password); 
} 
+0

欢迎来到StackOverflow Neil - 好的答案 – petenelson 2012-02-21 14:00:21

+3

不幸的是,这然后是服务定位器反模式,请参阅:http://bugsquash.blogspot.com/2010/11/windsor-managed-membershipproviders.html – 2012-02-21 15:47:33

+1

它肯定是反模式,但如果您的约束是利用现有的ASP.NET成员资格提供程序,那么您将面临重写所有成员资格和/或角色提供的内容,或引入此反模式。请注意,当替代方案可能需要大量工作时,反模式不会成功或失败。 – CodeMonkeyKing 2012-12-05 23:35:15

-1

这是因为你应该注入你的userRepository。例如:

protected override void Load(ContainerBuilder builder) 
{ 
    builder.RegisterType<UserRepository>().As<IUserReposotory>(); 
    builder.RegisterType<MyMembershipProvider>(); 
} 
+0

您确定MVC3支持成员资格提供程序的依赖注入吗? – jgauffin 2012-02-21 13:56:51

+0

没有propably不。尼尔有上面的答案。 – 2012-02-21 14:18:45

+0

在他的回答中内置了诸如@Neil提到的提供者,使用ASP.NET作为页面生命周期的一部分加载成员提供者。这早于MVC [1-4],也引入了IoC容器。 – CodeMonkeyKing 2012-12-05 23:32:49

1

避免在应用程序代码中解决(验证用户,等等),因为这是服务定位器的反模式。你只想解决你的'胶水'代码/低级代码。

这下面是windsor,但实施可以很容易地调整。这里是城堡windsor的一个概述,但实施应该是类似的。它有点清洁剂,因为这解决了呼叫GetProvider - 这是“胶水”代码在这里,从而避免在实际隶属函数的服务定位器反模式的使用(如的ValidateUser)

http://bugsquash.blogspot.com/2010/11/windsor-managed-membershipproviders.html

相关问题