2015-02-21 4 views
0

Я внедрил 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

ответ

1

Я нашел ответ в SO. @Mauricio Scheffer выполнил выборочную реализацию, чтобы использовать Windsor для инъекции зависимостей поставщику членства.

Оригинальный вопрос How do I control MembershipProvider instance creation/lifetime?

блоге @Mauricio Схеффер «s

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