如何使用 Autofac 注入 ASP.NET MVC3 自定义成员资格提供程序?

发布于 2025-01-07 06:58:38 字数 362 浏览 4 评论 0原文

我有一个使用 Autofac 的 MVC3 应用程序和一个自定义会员资格提供程序。

如果我尝试使用构造函数注入提供程序,则会收到错误:“没有为此对象定义无参数构造函数。”

public class MyMemberShipProvider : MembershipProvider
    {

        IUserRepository userRepository;

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

        }

I have an MVC3 app using Autofac and a custom membership provider.

If I try and inject the provider using the ctor, I get an error: 'No parameterless constructor defined for this object.'

public class MyMemberShipProvider : MembershipProvider
    {

        IUserRepository userRepository;

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

        }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

无需解释 2025-01-14 06:58:38

您无法注入内置提供程序(成员资格/角色)。
您可以将 MVC 3 DependencyResolver 与 Autofac 结合使用。

一个简单的例子...

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

You can not inject into the in-built providers (Membership / Roles).
You can use the MVC 3 DependencyResolver with Autofac.

A quick example...

public override bool ValidateUser(string username, string password)
{
    var userRepo = DependencyResolver.Current.GetService<IUserRepository>();
    return userRepo.ValidateUser(username, password);
}
牵强ㄟ 2025-01-14 06:58:38

避免在应用程序代码中解析(验证用户等),因为这是服务定位器反模式。您只想在“粘合”代码/低级代码中进行解析。

下面是针对温莎的,但可以轻松调整实现。这是温莎城堡的概述,但实现应该类似。它更干净一些,因为这在对 GetProvider 的调用中解析 - 这是此处的“粘合”代码,从而避免了实际成员函数(例如 ValidateUser)中的服务定位器反模式使用

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

Avoid resolving in application code (validate user, etc) as this is the service locator anti-pattern. You want to resolve only in your 'glue' code/low level code.

This below is for windsor, but the implementation can be easily adjusted. Here is one outlined for castle windsor, but the implementation should be similar. Its a bit cleaner as this resolves in the call to GetProvider - which is the 'glue' code here, thus avoiding the service locator anti-pattern usage in the actual membership functions (such as ValidateUser)

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

半边脸i 2025-01-14 06:58:38

那是因为你也应该注入你的 userRepository 。像这样的东西:

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

That´s because you should inject your userRepository as well. Something like:

protected override void Load(ContainerBuilder builder)
{
    builder.RegisterType<UserRepository>().As<IUserReposotory>();
    builder.RegisterType<MyMembershipProvider>();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文