2010-10-14 2 views
2

Я пытаюсь самостоятельно связать членствоProvider в ASP.NET MVC 2, а затем использовать эту привязку в конструкторе AccountController.Self binding Членский провайдер с Ninject

Это фрагмент из моих Global.asax.cs

// selfbind MembershipProvider in request scope 
Bind<MembershipProvider>().ToSelf().InRequestScope(); 

И отрывок из класса обслуживания:

public AccountMembershipService(MembershipProvider provider, IAccountRepository accountRepository) 
{ 
    _provider = provider ?? Membership.Provider; 
    _accountRepository = accountRepository; 
} 

Моя проблема заключается в том, что инъекции не работает (инъекции для AccountRepository делает работа однако). Это ошибка из Ninject:

Error activating MembershipProvider using self-binding of MembershipProvider 
No constructor was available to create an instance of the implementation type. 
Activation path: 
    3. Injection of dependency MembershipProvider into parameter provider of constructor of type AccountMembershipService 
    2. Injection of dependency IMembershipService into parameter membershipService of constructor of type AccountController 
    1. Request for IController 

Suggestions: 
1) Ensure that the implementation type has a public constructor. 
2) If you have implemented the Singleton pattern, use a binding with InSingletonScope() instead. 

Установка InSingletonScope() не имеет никакого значения, и я не могу ничего конструктору сделать, так как это не обычай MembershipProvider но один по умолчанию, который поставляется с ASP.NET.

Я застрял здесь, не знаю, как это решить.

ответ

4

Хорошо, нашел. Я ошибочно устанавливал членствоProvider для себя, что не могло работать, потому что MemberhipProvider является абстрактным классом.

Это работает

Bind<MembershipProvider>().ToConstant(Membership.Provider); 
2

Вам необходимо создать ctor провайдера членства, который пуст, и один с хранилищем на нем. Предполагается, что вы также зарегистрировали провайдера членства с ядром ...

Bind<MembershipProvider>().To<YourMembershipProvider>(); 
    Bind<IMembershipService>().To<AccountMembershipService>(); 
+0

Да, я думаю, ваша проблема с привязкой ядра к провайдеру ... попробуйте следующее: Bind () К () InRequestScope().. ; Вам не нужно будет передавать это репо, оно должно быть введено в MemberhipProvider ctor ... вот почему вам нужен пустой и один с вашим репо на нем. – CrazyDart

+0

У меня нет пользовательского провайдера членства на данный момент. Я хочу использовать провайдера Membership.Provider по умолчанию. Но все еще есть все готово, если мы в будущем внедрим пользовательский поставщик. – mare

+0

Хмммм, я думаю, вы должны отметить меня для ответа, поскольку я был прав, что привязка была плохая ... и я мог бы использовать очки. – CrazyDart