我在配置自定义asp.net membership service时遇到了问题。
在绑定模块时,我在应用程序启动时遇到了一条恼人的消息,这里是:
this.Bind<RoleProvider>()
.ToConstant(Roles.Providers["SQLiteRoleProvider"]);
this.Bind<MembershipProvider>()
.ToConstant(Membership.Providers["SQLiteMembershipProvider"]);
This method cannot be called during the application's pre-start initialization stage.
At
>System.Web.dll!System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()
in {System.Web.Compilation.BuildManager} System.Web.Compilation.BuildManager
我检查了一堆博客和SO问题,如
ASP.NET: This method cannot be called during the application's pre-start initialization stage
但也没有任何成功。
之前是否有人遇到此错误消息?
答案 0 :(得分:1)
更改绑定代码将解决问题。
this.Bind<RoleProvider>().ToProvider<SQLiteRoleProvider>();
this.Bind<MembershipProvider>().ToProvider<SQLiteMembershipProvider>();
只需SQLiteMembershipProvider
和SQLiteRoleProvider
实施IProvider
。
如果你推迟初始化,它就会正确。
答案 1 :(得分:0)
我也遇到了很多问题。有关Ninject无法正常工作的提供商的事情。我从未弄明白。我决定把它固定而不是注入。我将所有内容抽象为服务,并针对此服务类创建了Ninject绑定。我最终得到了一个使用我的Entity Framework成员资格提供程序的硬件代码的服务,如果我需要另一个提供程序,我将不得不实现另一个硬件编码提供程序的服务。
使用简单服务类进行注入有效,但不能与ToConstant()
直接绑定到提供者。
public class AccountMembershipService : IMembershipService
{
private readonly MembershipProvider _provider;
private readonly IAccountRepository _accountRepository;
private readonly IFirmsRepository _firmsRepository;
private readonly IRepository<Client> _clientsRepository;
public AccountMembershipService(IAccountRepository accountRepository, IFirmsRepository firmRepository,
IRepository<Client> clientsRepository)
{
_provider = System.Web.Security.Membership.Providers["EfMembershipProvider"];
_accountRepository = accountRepository;
_firmsRepository = firmRepository;
_clientsRepository = clientsRepository;
}
...
的global.asax.cs
Bind<IFormsAuthenticationService>().To<FormsAuthenticationService>();
Bind<IMembershipService>().To<AccountMembershipService>();
Bind<IAccountRepository>().To<EntityFrameworkAccountProvider>();
// never worked
//Bind<MembershipProvider>().ToConstant(System.Web.Security.Membership.Providers["EfMembershipProvider"]);