Так что я пытаюсь настроить мое приложение на использование 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?