DI与MVC和自定义MembershipProvider

时间:2012-02-05 22:47:34

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

我正在使用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属性的空引用异常。我如何告诉Castle Windsor注入我的财产?

3 个答案:

答案 0 :(得分:3)

ASP.NET不会将成员资格提供程序的创建委托给第三方(即,您不能DI MembershipProvider)。这是ASP.NET的难点之一。可以通过Membership.Provider访问ASP.NET创建的MembershipProvider实例。你可以在这上面做房产注入。

答案 1 :(得分:1)

我创建了一个会员提供商,它在较小的界面中分解了不同的职责(允许你使用DI)。它是免费的,可作为nuget包使用

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

答案 2 :(得分:0)

正如Eranga指出的那样,您必须在第一次访问MembershipProvider时手动注入属性。你可以做的不多,因为MembershipProvider加载它的实例深入asp.net的内容。

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

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