我正在使用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注入我的财产?
答案 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提供者是静态类。每个应用程序创建一次,因此连接将在应用程序池的生命周期内保持打开状态。
对于我的自定义提供程序,我通常只是新建我的实例,以便更好地维护连接生存期。它很糟糕,但我觉得它比留下悬挂的连接更好。