2017-02-03 23 views
2

Я только что начал с Autofac и попытался подключить идентификатор Asp.Net, и я терпит неудачу. Я думал, что у меня все работает, но я застрял и нуждаюсь в руке.Autofac, операция разрешения завершена

UserManager вводится через конструктор.

private readonly ApplicationUserManager UserManager; 
     private readonly ApplicationSignInManager SignInManager; 
     public UserController(IDocumentSession documentSession, ApplicationUserManager userManager, ApplicationSignInManager signInManager) : base(documentSession) { 
      UserManager = userManager; 
      SignInManager = signInManager; 
     } 

У меня проблемы с UserController.cs, когда я достигаю этого асинхронного вызова.

var user = await UserManager.FindAsync(model.Email, model.Password); 

Эта операция решительность уже закончилась. При регистрации компонентов с использованием lambdas параметр IComponentContext 'c' для лямбда не может быть сохранен. Вместо этого либо разрешите IComponentContext снова с 'c', либо разрешите фабрику Func <> для создания следующих компонентов .

Проблема в том, что я получаю довольно четкое сообщение, но я не знаю, как продолжить его; должен ли я регистрировать свой ApplicationUserManager по-другому?

У меня есть мой контейнер, как это. Надеюсь, кто-то может взглянуть.

public static void RegisterContainer(IAppBuilder app) 
     { 
      // Autofac container .. 
      var builder = new ContainerBuilder(); 

      // Register all MVC Controllers 
      builder.RegisterControllers(Assembly.GetExecutingAssembly()); 

      // Register all services that implement the Module interface 
      builder.RegisterAssemblyModules(BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToArray()); 

      // Register the DocumentStore instance 
      builder.Register(context => new RavenDocumentStoreFactory() 
       .FindOrCreate()) 
       .As<IDocumentStore>() 
       .SingleInstance(); 

      // Multi tenancy part  
      var tenantIdStrategy = new TenantIdStrategy(); 
      var multitenantContainer = new MultitenantContainer(tenantIdStrategy, builder.Build()); 
      var tenantIds = new[] 
      { 
       "subdomain1.tickets", 
       "localhost" 
      }; 

      foreach (var tenantId in tenantIds) 
      { 
       var databaseName = $"ticketTenant-{tenantId.Replace('.', '_')}"; 



       multitenantContainer.ConfigureTenant(tenantId, b => 
       { 
        // Init RavenDB 
        b.Register(context => new RavenDocumentSessionFactory(databaseName)) 
         .InstancePerTenant() 
         .AsSelf(); 

        // Session per request 
        b.Register(context => context.Resolve<RavenDocumentSessionFactory>() 
         .FindOrCreate(context.Resolve<IDocumentStore>())) 
         .As<IDocumentSession>() 
         .InstancePerRequest() 
         .OnRelease(x => 
         { 
          x.SaveChanges(); 
          x.Dispose(); 
         }); 

        // ASP.Net Identity Registrations 
        b.Register(context => new UserStore<User>(context.Resolve<IDocumentSession>)) 
         .AsImplemented‌​Interfaces() 
         .Instanc‌​ePerRequest() 
         .OnRelease(x => 
         { 
          x.Dispose(); 
         }); 

        b.Register<IdentityFactoryOptions<ApplicationUserManager>>(c => 
         new IdentityFactoryOptions<ApplicationUserManager>() { 
          DataProtectionProvider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionPr‌​ovider("ApplicationName") 
        }); 

        b.RegisterType<ApplicationUserManager>().AsSelf().Inst‌​ancePerRequest(); 
        b.RegisterType<ApplicationSignInManager>().AsSelf().InstancePerRequest(); 
        b.Register<IAuthenticationManager>(c => HttpContext.Current.GetOwinContext().Authentication).InstancePerRequest(); 
        b.Register<IDataProtectionProvider>(c => app.GetDataProtectionProvider()).InstancePerRequest(); 


       }); 
      } 

      // Register in Owin 
      app.UseAutofacMiddleware(multitenantContainer); 
      app.UseAutofacMvc(); 

      // Dependency Resolver to Autofac 
      DependencyResolver.SetResolver(new AutofacDependencyResolver(multitenantContainer)); 
     } 
    } 

ответ

2

Я решил свою проблему, но, честно говоря, у меня нет понятия, как я это исправил. Это была просто пробная версия и ошибка. Это новая конфигурация; прокомментирована старая часть.

Он даже не нуждается в последнем Регистре в части Owin ... даже прокомментировал, что он работает нормально сейчас.

// ASP.Net Identity Registrations 
        /* 
        b.Register(context => new UserStore<User>(context.Resolve<IDocumentSession>)) 
         .AsImplemented‌​Interfaces() 
         .Instanc‌​ePerRequest() 
         .OnRelease(x => 
         { 
          x.Dispose(); 
         }); 

        b.Register<IdentityFactoryOptions<ApplicationUserManager>>(c => 
         new IdentityFactoryOptions<ApplicationUserManager>() { 
          DataProtectionProvider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionPr‌​ovider("ApplicationName") 
        }); 

        b.RegisterType<ApplicationUserManager>().AsSelf().Inst‌​ancePerRequest(); 
        b.RegisterType<ApplicationSignInManager>().AsSelf().InstancePerRequest(); 
        b.Register<IAuthenticationManager>(c => HttpContext.Current.GetOwinContext().Authentication).InstancePerRequest(); 
        b.Register<IDataProtectionProvider>(c => app.GetDataProtectionProvider()).InstancePerRequest(); 
        */ 

        b.Register(c => new UserStore<User>(c.Resolve<IDocumentSession>())).As<IUserStore<User>>().InstancePerRequest() 
         .OnRelease(x => 
         { 
          x.Dispose(); 
         }); 
        b.RegisterType<ApplicationUserManager>().InstancePerRequest(); 
        b.RegisterType<ApplicationSignInManager>().InstancePerRequest(); 
        b.Register<IAuthenticationManager>(c => HttpContext.Current.GetOwinContext().Authentication).InstancePerRequest(); 
        b.Register<IDataProtectionProvider>(c => app.GetDataProtectionProvider()).InstancePerRequest(); 
+0

Могу ли я сделать одно предложение. Swap 'InstancePerRequest' на' InstancePerLifetimeScope', это сэкономит вам кучу головных болей по дороге, когда вы начнете работать с областями вне запросов. [Документация] (http://docs.autofac.org/en/latest/lifetime/instance-scope.html#instance-per-lifetime-scope) – Nico

+1

@ Нико, спасибо, очень хорошее предложение. Я только что прочитал информацию об этом, и все ожидаемые регистрации могут истечь для детей. –