【问题标题】:DI with MVC and custom MembershipProvider带有 MVC 和自定义 MembershipProvider 的 DI
【发布时间】:2012-02-05 22:47:34
【问题描述】:

我正在开发一个 ASP.NET MVC3 应用程序,它有一个自定义 MembershipProvider 来处理身份验证。此提供程序依赖于名为 IUserService 的服务,该服务由属性注入设置。

public class MyMembershipProvider : MembershipProvider
{
    public IUserService UserService { get; set; }

    public override bool ValidateUser(string username, string password)
    {
        return UserService.IsValidLogon(username, password);
    }
}

我正在使用 Castle Windsor 3 来管理一切。在我的应用程序启动中,我成功注册了会员提供者:

protected void Application_Start()
{
    _container = new WindsorContainer().Install(FromAssembly.This());
    _container.Register(Component.For<MyMembershipProvider>().LifeStyle.Transient.Named("myProvider"));
}

但是当调用提供程序时,我得到了 UserService 属性的空引用异常。我如何告诉温莎城堡注入我的财产?

【问题讨论】:

标签: asp.net-mvc-3 dependency-injection castle-windsor


【解决方案1】:

ASP.NET 不会将成员资格提供程序的创建委托给第 3 方(即,您不能 DI MembershipProvider)。这是 ASP.NET 的痛点之一。 ASP.NET创建的MembershipProvider实例可以通过Membership.Provider访问。您可以对此进行属性注入。

【讨论】:

  • 我发现这篇文章 - bugsquash.blogspot.com.au/2010/11/… 似乎提供了一个可行的解决方案 - 你怎么看?
  • @DavidKeaveny 它是一个将调用委托给底层提供者的适配器。看起来不错。
【解决方案2】:

我创建了一个成员资格提供程序,它在较小的接口中分解了不同的职责(允许您使用 DI)。它是免费的,可作为 nuget 包使用

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

【讨论】:

  • 这对于将成员资格提供程序抽象为更可测试的接口非常有用。但是,问题是如何在提供程序本身中使用 DI。
【解决方案3】:

正如 Eranga 指出的,您必须在第一次访问 MembershipProvider 时手动注入属性。您对此无能为力,因为 MembershipProvider 将其实例加载到了 asp.net 的深处。

但是,我建议您不要对此使用依赖注入。由于 Membership 提供者是一个静态类。它为每个应用程序创建一次,因此连接将在应用程序池的整个生命周期内保持打开状态。

对于我的自定义提供程序,我通常只是新建我的实例,以便更好地维护连接生命周期。这很糟糕,但我觉得这比留下一个悬挂的连接要好。

【讨论】:

  • “你无能为力” -> 是的,你可以,见stackoverflow.com/questions/1003587/…
  • @MauricioScheffer - 是的,但它仍然受到对象将在应用程序池的生命周期内挂起(因此连接将保持打开)的事实。
  • @MystereMan :只有适配器对象,而不是您的自定义成员资格提供程序,这在这里很重要。
  • @MauricioScheffer - 不,您的自定义成员资格提供程序也会在应用程序的整个生命周期内一直存在,并且由于您在提供程序的构造函数中创建连接(通过使用服务定位器),这意味着它始终保留一个引用,因此在收集应用程序池之前连接保持打开状态。
  • @MystereMan :不,您可以定义自定义会员的生活方式。如果你愿意,你可以让它瞬变。看看我的文章和实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多