【问题标题】:Windsor Castle : Property Inject温莎城堡:财产注入
【发布时间】:2015-02-21 18:18:47
【问题描述】:

我实现了一个派生自 ExtendedMembershipProviderCustomMembershipProviderIUserServiceCustomMembershipProvider 的依赖项,用于验证给定的凭据。 这将在 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 在调用 ValidateUser 时始终为 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 属性

【问题讨论】:

    标签: property-injection castle-windsor-3


    【解决方案1】:

    我在 SO 中找到了答案。 @Mauricio Scheffer 已经完成了自定义实现,以利用 Windsor 向会员提供者注入依赖项。

    原始问题 How do I control MembershipProvider instance creation/lifetime?

    @Mauricio Scheffer 的博文

    http://bugsquash.blogspot.com/2010/11/windsor-managed-membershipproviders.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多