我实现了一个派生自ExtendedMembershipProvider的CustomMembershipProvider。IUserService是 CustomMembershipProvider 的依赖项,它将用于验证给定的凭据。这将在 Web.Config 中进行配置;
<membership defaultProvider="DefaultMembershipProvider">
<providers>
<add name="DefaultMembershipProvider" type="BorderExpress.AutoImport.Web.Security.CustomMembershipProvider" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
</providers>
</membership>
无法通过构造函数注入IUserService实现,因为CustomMembershipProvider需要无参数构造函数。
于是想到了引入属性注入。我将 IUserService 作为 CustomMembershipProvider 的公共属性。
public class CustomMembershipProvider : ExtendedMembershipProvider
{
public IUserService UserService { get; set; }
public CustomMembershipProvider()
{
}
...
public override bool ValidateUser(string username, string password)
{
var user = UserService.GetUser(username);
if (user != null && SaltedHash.Verify(user.Salt, user.Hash, password))
{
return true;
}
return false;
}
}
我只为此注册编写了一个单独的安装程序
public class WindsorMembershipInstaller:IWindsorInstaller
{
public void Install(Castle.Windsor.IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
{
container.Register(
Component.For<CustomMembershipProvider>()
);
}
}
这不起作用,并且在调用 ValidateUser 时UserService始终为 NULL。
我尝试了贡献者;
public class RequireUserServiceProperties : IContributeComponentModelConstruction
{
public void ProcessModel(Castle.MicroKernel.IKernel kernel, Castle.Core.ComponentModel model)
{
model.Properties
.Where(p => p.Dependency.TargetItemType == typeof(IUserService))
.All(p => p.Dependency.IsOptional = false);
}
}
并在我引导容器的地方注册贡献者。
_container = new WindsorContainer()
.Install(FromAssembly.This());
_container.Kernel.ComponentModelBuilder.AddContributor(new RequireUserServiceProperties());
请让我知道如何注入 CustomMembershipProvider 的 IUserService属性