使用Sqlite安装程序Ninject MVC3 ASP.NET CustomMembershipService

时间:2011-07-05 11:01:30

标签: sqlite asp.net-mvc-3 asp.net-membership ninject membership-provider

我在配置自定义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

.net console app lifecycle - working around a pre-start initialization error from BuildManager.GetReferencedAssemblies

http://weblogs.asp.net/leftslipper/archive/2010/07/28/migrating-asp-net-mvc-2-applications-to-asp-net-mvc-3-preview-1.aspx#7635403

但也没有任何成功。

之前是否有人遇到此错误消息?

2 个答案:

答案 0 :(得分:1)

更改绑定代码将解决问题。

this.Bind<RoleProvider>().ToProvider<SQLiteRoleProvider>();
this.Bind<MembershipProvider>().ToProvider<SQLiteMembershipProvider>();

只需SQLiteMembershipProviderSQLiteRoleProvider实施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"]);
相关问题