Я внедрил CustomMembershipProvider, который является производным от ExtendedMembershipProvider. 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>()
);
}
}
Это не сработало и UserService всегда NULL в момент вызова ValidateUser.
И я попробовал авторов;
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());
Пожалуйста, дайте мне знать, как придать свойство IUserService из CustomMembershipProvider