2016-10-03 3 views
0

Так что я пытаюсь настроить мое приложение на использование Simple Injector с Microsoft ASP.NET.Identity по умолчанию, но я не могу заставить его работать. Я изучил различные источники, такие как здесь: https://simpleinjector.codeplex.com/discussions/564822Простой инжектор - ApplicationSignInManager зарегистрирован как переходный, но реализует IDisposable

Но я ударил еще одну привязку с помощью SignInManager. Полное сообщение об ошибке, которое я получаю, следующее:

Неверная конфигурация. Были сообщены следующие диагностические предупреждения:

- [Одноразовый переходный компонент] ApplicationSignInManager зарегистрирован как переходный, но реализует IDisposable.

Дополнительную информацию о предупреждениях см. В описании свойства «Ошибка». Пожалуйста, см. https://simpleinjector.org/diagnostics, как устранить проблемы и как подавить отдельные предупреждения.

Я посмотрел вокруг, и я видел, что я мог бы добавить эту строку в DI в SignInManager:

RegisterPerWebRequest<SignInManager<ApplicationUser, string>, ApplicationSignInManager>(); 

Однако, когда я делаю это я получаю гораздо больше ошибок, которые выглядят как так:

Неверная конфигурация. Были сообщены следующие диагностические предупреждения:

- [Зависимость от короткого замыкания] AccountController может ошибочно зависеть от незарегистрированного типа ApplicationSignInManager (Transient) вместо SignInManager (веб-запрос).

- [Short Circuited Dependency] ManageController может ошибочно зависеть от незарегистрированного типа ApplicationSignInManager (Transient) вместо SignInManager (веб-запрос).

- [Одноразовый переходный компонент] ApplicationSignInManager зарегистрирован как переходный, но реализует IDisposable.

- [Неоднозначный образ жизни] Регистрация для ApplicationSignInManager (Transient) сопоставляется с той же реализацией (ApplicationSignInManager), что и регистрация для SignInManager (веб-запрос), но регистрация сопоставляется с другим образом жизни. Это приведет к тому, что каждая регистрация будет разрешена для другого экземпляра.

- [Неоднозначный образ жизни] Регистрация для SignInManager (веб-запроса) сопоставляется с той же реализацией (ApplicationSignInManager), что и для регистрации для ApplicationSignInManager (Transient), но регистрация сопоставляется с другим образом жизни. Это приведет к тому, что каждая регистрация будет разрешена для другого экземпляра.

Дополнительную информацию о предупреждениях см. В описании свойства «Ошибка». Пожалуйста, см. https://simpleinjector.org/diagnostics, как устранить проблемы и как подавить отдельные предупреждения.

Я не уверен, как DI SignInManager, поэтому я могу заставить его работать с моим приложением.

Мой контроллер счета выглядит следующим образом:

public class AccountController : Controller 
{ 
    private ApplicationSignInManager _signInManager; 
    private ApplicationUserManager UserManager; 

    public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager) 
    { 
     UserManager = userManager; 
     SignInManager = signInManager; 
    } 

    public ApplicationSignInManager SignInManager 
    { 
     get 
     { 
      return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>(); 
     } 
     private set { _signInManager = value; } 
    } 
} 

И мой Inialiser для Simple Injector, как это:

public static class SimpleInjectorInitializer 
{ 
    public static Container Initialize(IAppBuilder app) 
    { 
     var container = GetInitializeContainer(app); 

     container.Verify(); 

     DependencyResolver.SetResolver(
      new SimpleInjectorDependencyResolver(container)); 

     return container; 
    } 

    private static Container GetInitializeContainer(IAppBuilder app) 
    { 
     var container = new Container(); 

     container.RegisterSingleton(app); 

     container.RegisterPerWebRequest<ApplicationUserManager>(); 

     container.RegisterPerWebRequest(() => new ApplicationDbContext(
      "connectionString")); 

     container.RegisterPerWebRequest<IUserStore<ApplicationUser>>(() => 
      new UserStore<ApplicationUser>(
       container.GetInstance<ApplicationDbContext>())); 

     container.RegisterInitializer<ApplicationUserManager>(
      manager => InitializeUserManager(manager, app)); 

     container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); 

     container.Register<IAuthorisationManager, AuthorisationManager>(
      Lifestyle.Transient); 
     container.Register<IAuthorisationRepository, AuthorisationRepository>(
      Lifestyle.Transient); 

     container.RegisterPerWebRequest<SignInManager<ApplicationUser, string>, 
      ApplicationSignInManager>(); 

     container.RegisterPerWebRequest(() => 
      AdvancedExtensions.IsVerifying(container) 
       ? new OwinContext(new Dictionary<string, object>()).Authentication 
       : HttpContext.Current.GetOwinContext().Authentication); 

     return container; 
    } 

    private static void InitializeUserManager(ApplicationUserManager manager, IAppBuilder app) 
    { 
     manager.UserValidator = new UserValidator<ApplicationUser>(manager) 
     { 
      AllowOnlyAlphanumericUserNames = false, 
      RequireUniqueEmail = true 
     }; 

     //Configure validation logic for passwords 
     manager.PasswordValidator = new PasswordValidator() 
     { 
      RequiredLength = 6, 
      RequireNonLetterOrDigit = false, 
      RequireDigit = true, 
      RequireLowercase = true, 
      RequireUppercase = true, 
     }; 

     var dataProtectionProvider = app.GetDataProtectionProvider(); 

     if (dataProtectionProvider != null) 
     { 
      manager.UserTokenProvider = 
       new DataProtectorTokenProvider<ApplicationUser>(
        dataProtectionProvider.Create("ASP.NET Identity")); 
     } 
    } 
} 

Может кто-нибудь помочь мне использовать простой Инжектор зарегистрировать свой SignInManager?

ответ

0

Я не вводил правильный знак в менеджере моих контроллеров:

public class AccountController : Controller 
    { 
     private SignInManager<ApplicationUser, string> SignInManager; 
     private ApplicationUserManager UserManager; 

     public AccountController(ApplicationUserManager userManager, SignInManager<ApplicationUser, string> signInManager) 
     { 
      UserManager = userManager; 
      SignInManager = signInManager; 
     } 
    } 

Хотя я теперь получаю вопрос количества параметров рассогласования при запуске, который я ищу в

Смежные вопросы