如何注入UserManager和SignInManager我在我的应用程序中安装了Ninject,并按以下方式使用它:请将其视为一个全新的项目。在Startup.cs中,我有以下内容:publicpartialclassStartup{publicvoidConfiguration(IAppBuilderapp){ConfigureAuth(app);app.UseNinjectMiddleware(CreateKernel);}privatestaticIKernelCreateKernel(){varkernel=newStandardKernel();kernel.Load(Assembly.GetExecutingAssembly());返回内核;现在,如果我要创建一些Dummy类并尝试根据其工作接口注入它。我测试了它。我想弄清楚的是我现在如何从Startup.Auth.cs中删除以下内容并将其注入。如果没有我可以依赖的接口,我不知道如何做到这一点:app.CreatePerOwinContext(ApplicationDbContext.Create);app.CreatePerOwinContext(ApplicationUserManager.Create);app.CreatePerOwinContext(ApplicationSignInManager.Create);是:如何实例化ApplicationUserManager和ApplicationSignInManager并将它们注入我的控制器参数。这是我试图将其注入的控制器:publicAccountController(ApplicationUserManageruserManager,ApplicationSignInManagersignInManager){登录管理器=登录管理器;}编辑:这是我试过的:privatestaticIKernelCreateKernel(){varkernel=newStandardKernel();kernel.Load(Assembly.GetExecutingAssembly());kernel.Bind().To();kernel.Bind().ToSelf();返回内核;但是有了这个,我得到了空引用错误先决条件使用MVC模板启动新的MVC5应用程序。这将安装所有必需的依赖项并部署包含Microsoft.AspNet.Identity的引导程序代码的Startup.Auth.cs文件(它还包括对Microsoft.AspNet.Identity的所有引用)。安装以下软件包,然后将它们更新到最新版本。Install-PackageNinjectInstall-PackageNinject.MVC5配置删除AccountController上的默认构造函数,因此仅保留参数化构造函数。它应该有以下签名。publicAccountController(ApplicationUserManageruserManager,ApplicationSignInManagersignInManager)这将确保如果注入失败,您将得到一个错误,这正是我们想要的。NInject配置NInjectNuGet包部署将创建一个名为NinjectWebCommon.cs的文件,样板NInject注册将在其中进行。这有一个具有以下签名的方法,您可以随注册一起扩展。privatestaticvoidRegisterServices(IKernelkernel)现在我们将以下代码添加到此方法中,使NInject自动注入ApplicationSignInManager和ApplicationUserManager实例。privatestaticvoidRegisterServices(IKernelkernel){kernel.Bind().To>();kernel.Bind>().ToSelf();kernel.Bind().ToMethod(ctx=>newHttpContextWrapper(HttpContext.Current)).InTransientScope();kernel.Bind().ToMethod((context)=>{varcbase=newHttpContextWrapper(HttpContext.Current);returncbase.GetOwinContext().Get();});内核.Bind()。自我();}就这样。现在您应该能够导航到登录或注册链接并注入。备选方案我更喜欢代理方法,它为ApplicationSignInManager和ApplicationUserManager实例公开有限的功能。然后我将这个代理注入到必要的控制器中。它有助于从控制器中提取一些身份信息,以便将来更容易更改。这不是一个新概念,您是否这样做取决于项目的规模和复杂性以及您希望如何处理依赖关系。所以好处是(对任何代理都是通用的):代码示例:publicinterfaceIAuthManager{}publicclassAuthManager:IAuthManager{privateApplicationUserManager_userManager;ApplicationSignInManager_signInManager;publicAuthManager(ApplicationUserManageruserManager,ApplicationSignInManagersignInManager){this._userManager=userManager;this._signInManager=signInManager;}publicTaskPasswordSignInAsync(stringuserName,stringpassword,boolrememberMe){return_signInManager.PasswordSignInAsync(userName,password,rememberMe,true);在NInject依赖注册中添加以下行。kernel.Bind().To();更改您的AccountController构造函数以采用IAuthManager的实例。最后更改您的方法以直接引用此代理而不是ASP.NETIdentity类。免责声明-我没有接一个复杂的电话,只是一个非常简单的电话来说明我的观点。这也是完全可选的,你是否真的这样做应该取决于你的项目的范围和大小以及你计划如何使用ASP.NETIdentity框架为了准确回答我的问题,这里是代码和说明:SectionStep1:创建自定义用户存储publicclassApplicationUserStore:UserStore{publicApplicationUserStore(ApplicationDbContextcontext):base(context){}}步骤2:更新ApplicationUserManager并将代码从Create方法移动到构造函数,IdentityFactoryOptions选项):base(store){this.UserValidator=newUserValidator(this){AllowOnlyAlphanumericUserNames=false,RequireUniqueEmail=true};//配置密码验证逻辑this.PasswordValidator=newPasswordValidator{=6,RequireNonLetterOrDigit=true,RequireDigit=true,RequireLowercase=true,RequireUppercase=true,};//配置用户锁定默认值this.UserLockoutEnabledByDefault=true;this.DefaultAccountLockoutTimeSpan=TimeSpan.FromMinutes(5);this.MaxFailedAccessLockouts//雷吉斯ter双因素身份验证提供程序。此应用程序使用电话和电子邮件作为接收验证用户代码的步骤//您可以编写自己的提供程序并将其插入此处。this.RegisterTwoFactorProvider("PhoneCode",newPhoneNumberTokenProvider{MessageFormat="您的安全码是{0}"});this.RegisterTwoFactorProvider("EmailCode",newEmailTokenProvider{Subject="SecurityCode",BodyFormat="Yoursecuritycodeis{0}"});this.EmailService=newEmailService();this.SmsService=newSmsService();vardataProtectionProvider=options.DataProtectionProvider;if(dataProtectionProvider!=null){this.UserTokenProvider=newDataProtectorTokenProvider(dataProtectionProvider.Create("ASP.NETIdentity"));}}}步骤3:修改Startup.Auth类并注??解掉以下代码//app.CreatePerOwinContext(ApplicationDbContext.Create);//app.CreatePerOwinContext(ApplicationUserManager.Create);//app.CreatePerOwinContext(ApplicationSignInManager.Create);步骤4:更新帐户控制器(或任何其他有问题的控制器)并添加以下构造函数_signInManager=signInManager;_authManager=authManager;}步骤5:更新AccountControl}}publicApplicationSignInManagerSignInManager{get{return_signInManager;}}publicApplicationUserManagerUserManager{get{return_userManager;}}privateIAuthenticationManagerAuthenticationManager{get{return_authManager;}ubStart}第6步:更新publicpartialclassStartup{privateIAppBuilder_app;publicvoidConfiguration(IAppBuilderapp){ConfigureAuth(app);_app=应用程序;app.UseNinjectMiddleware(CreateKernel);}privateIKernelCreateKernel(){varkernel=newStandardKernel();(程序集.GetExecutingAssembly());kernel.Bind().ToSelf().InRequestScope();kernel.Bind().To();kernel.Bind().ToSelf();kernel.Bind().ToSelf();kernel.Bind().ToMethod(x=>HttpContext.Current.GetOwinContext().Authentication);kernel.Bind().ToMethod(x=>_app.GetDataProtectionProvider());返回内核;根据我收到的评论进一步扩展这个问题回答:这些管理器不应该被注入到类中,因为你还没有完成DI你应该做的是创建多个接口,根据你的需要进一步分离和分组UserManager的方法.这是一个示例:publicinterfaceIUserManagerSegment{TaskCreateAsync(ApplicationUseruser,stringpassword);任务CreateAsync(ApplicationUser用户);任务ConfirmEmailAsync(stringuserId,stringtoken);任务FindByNameAsync(字符串用户名);任务IsEmailConfirmedAsync(stringuserId);任务ResetPasswordAsync(字符串userId,字符串令牌,字符串newPassword);任务>GetValidTwoFactorProvidersAsync(stringuserId);任务AddLoginAsync(字符串userId,UserLoginInfo登录);无效处置(布尔处置);无效处置();我选择了几种随机方法来说明这一点。话虽如此,我们不会像这样基于接口注入方法:kernel.Bind().To();现在我们的AccountController构造函数看起来像这样:_signInManager=signInManager;_authManager=authManager;}应该对SignInManager和AuthenticationManager做同样的事情。上面的代码已经过测试并且可以正常工作。只需确保您引用了以下DLL:Ninject.dllNinject.Web.CommonNinject.Web.Common.OwinHostNinject.Web.Mvc这就是C#学习教程:如何注入UserManager和SignInManager有用且需要了解更多关于C#学习教程,希望大家多多关注—本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: