Ninject MVC3 ASP.NET CustomMembershipService с установкой Sqlite - PullRequest
2 голосов
/ 05 июля 2011

Я столкнулся с проблемой при настройке пользовательской службы 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

Я проверил кучу блогов и ТАК вопрос, как

ASP.NET: этот метод не может быть вызван на этапе предварительной запуска приложения

жизненный цикл консольного приложения .net - обход ошибки предварительной инициализации из 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 ]

1 голос
/ 06 июля 2011

Изменение кода привязки решит проблему.

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

Просто сделайте SQLiteMembershipProvider и SQLiteRoleProvider, реализующие IProvider.

Если вы отложите инициализацию, она собираетсяполучить право.

0 голосов
/ 05 июля 2011

У меня тоже были огромные проблемы с этим. Что-то о провайдерах, которые плохо работают с 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"]);
...