我在配置自定义asp.net成员服务时遇到了问题。
我有一个恼人的消息在应用程序启动时绑定模块,这里是:
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。此方法不能在应用程序's启动前初始化阶段被调用
.net控制台应用程序的生命周期-解决一个从BuildManager启动前初始化错误。GetReferencedAssemblieshttp://weblogs.asp.net/leftslipper/archive/2010/07/28/migrating asp -网- mvc 2 -应用程序- asp -网- mvc 3 -预览- 1. - aspx # 7635403
还没有成功。
以前有人遇到过这个错误信息吗?
修改绑定代码可以解决这个问题。
this.Bind<RoleProvider>().ToProvider<SQLiteRoleProvider>();
this.Bind<MembershipProvider>().ToProvider<SQLiteMembershipProvider>();
让SQLiteMembershipProvider
和SQLiteRoleProvider
实现IProvider
。
如果你推迟初始化它就会恢复正常
我也遇到了很大的问题。关于提供程序的一些东西不能很好地与Ninject一起工作。我一直没弄明白。我决定让它固定而不是注射。我把所有东西抽象成一个服务,并针对这个服务类做了Ninject绑定。我最终得到了一个硬编码使用实体框架成员提供程序的服务,如果我需要另一个提供程序,我将不得不实现另一个具有该提供程序硬编码的服务。
注入一个简单的服务类可以工作,但它不能与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"]);