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>
CustomMembershipProviderにはパラメーターのないコンストラクターが必要なため、コンストラクターを介してIUserService実装を注入することはできません。
そこで、プロパティ注入を導入することを考えました。CustomMembershipProvider のパブリック プロパティとして IUserService を作成しました。
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プロパティを挿入する方法を教えてください。