2011-01-10 3 views
7

Я использую Ninject как мой IoC, и я написал поставщик ролей следующим образом:Ninject with MembershipProvider | RoleProvider

public class BasicRoleProvider : RoleProvider 
{ 
    private IAuthenticationService authenticationService; 

    public BasicRoleProvider(IAuthenticationService authenticationService) 
    { 
     if (authenticationService == null) throw new ArgumentNullException("authenticationService"); 
     this.authenticationService = authenticationService; 
    } 

    /* Other methods here */ 
} 

Я читал, что Provider классов получить экземпляр, прежде чем Ninject получает впрыснуть экземпляр. Как мне обойти это? В настоящее время у меня есть этот код ninject:

Bind<RoleProvider>().To<BasicRoleProvider>().InRequestScope(); 

От этого ответа here.

If you mark your dependencies with [Inject] for your properties in your provider class, you can call kernel.Inject(MemberShip.Provider) - this will assign all dependencies to your properties.

Я не понимаю этого.

+0

Возможный дубликат [Inject репозиторий для пользовательского поставщика членства с Ninject] (http://stackoverflow.com/questions/5596441/inject-repository-to-custom-membership-provider-with-ninject) –

ответ

9

Я считаю, что этот аспект структуры ASP.NET очень управляется конфигурацией.

Для вашего последнего комментария, что они означают, что вместо того, чтобы полагаться на инъекции конструктора (что происходит, когда компонент создается), вы можете использовать сеттер инъекции вместо этого, например:

public class BasicRoleProvider : RoleProvider 
{ 
    public BasicRoleProvider() { } 

    [Inject] 
    public IMyService { get; set; } 
} 

Он будет автоматически вставьте экземпляр вашего зарегистрированного типа в свойство. Затем вы можете сделать звонок из вашей заявки:

public void Application_Start(object sender, EventArgs e) 
{ 
    var kernel = // create kernel instance. 
    kernel.Inject(Roles.Provider); 
} 

Предполагая, что вы зарегистрировали своего поставщика ролей в конфиге. Регистрация провайдера таким образом по-прежнему допускает большую модульность, так как реализация вашего приложения и приложение все еще очень развязаны.

+0

Это не работает. Экземпляр по-прежнему равен нулю. –

+0

Я попробовал 'kernel.Inject (Roles.Provider)' и 'kernel.Inject (Membership.Provider)' –

+0

Хмм, я протестировал это с помощью 'kernel.Inject (Roles.Provider)'. Можете ли вы обновить свой вопрос с помощью кода конфигурации и вашего кода RoleProvider, где вы пытаетесь ввести. Можете ли вы проверить, что вы также установили свой RoleProvider. –