AspIdentiy ApplicationUserManager 是静态的,如何扩展使

AspIdentiy ApplicationUserManager is Static, how to extend so it participates in my IoC framework?(AspIdentiy ApplicationUserManager 是静态的,如何扩展使其参与我的 IoC 框架?)

本文介绍了AspIdentiy ApplicationUserManager 是静态的,如何扩展使其参与我的 IoC 框架?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在一个新的 ASPNET MVC 应用程序中,您现在可以免费获得 AspIdentity 好东西.

In a new ASPNET MVC application you now get the AspIdentity goodies for free.

有一条无害的小线在此处插入您的电子邮件服务".

There's a harmless little line 'plug in your email service here'.

所以我做到了:

public class EmailService : IIdentityMessageService
{
    private static My.Services.IEmailService _emailservice;

    public EmailService(Insolvency.Services.IEmailService emailservice)
    {
        _emailservice = emailservice;
    }

    public Task SendAsync(IdentityMessage message)
    {
        _emailservice.SendEmail(message);
       return Task.FromResult(0);
    }
}

现在是喜悦:

public class ApplicationUserManager : UserManager<ApplicationUser>
{
    private My.Services.IEmailService _emailservice;

    public ApplicationUserManager(IUserStore<ApplicationUser> store, My.Services.IEmailService emailservice): base(store)        
    {
        _emailservice = emailservice;
    }

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
    {
        var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()), _emailservice);
       ...

当 Owin 启动时,它会在 Startup.Auth.cs 中调用 ApplicationUserManager 上的 Create:

as Owin kicks in it calls the Create on ApplicationUserManager in Startup.Auth.cs:

public partial class Startup 
   {
    public void ConfigureAuth(IAppBuilder app) 
     {
        ...
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

因为我在 global.asax.cs 中使用 AutoFac 作为我的 IoC 容器

and as I'm using AutoFac as my IoC container, in global.asax.cs

builder.RegisterType<My.Services.EmailService>().As<IEmailService>();

如果 Create 方法是静态的,那么我得到:
_emailService 为空

if the Create method is static so I get:
_emailService is null

我看过这里:http://forums.asp.net/post/5293670.aspx 和 我如何创建UserManager 的实例 和 使用 Autofac 提供类型由静态工厂导出.但没有运气.

I've looked here:http://forums.asp.net/post/5293670.aspx, and How do i create an instance of UserManager and Using Autofac to provide types exported by static factory. but no luck.

如果我改变:

private My.Services.IEmailService _emailservice;

要公开非静态我感觉 IoC 大神摇头,我无法构建'需要对象引用'

to be public non-static I feel IoC gods shaking their heads, and I can't build 'object reference required'

推荐答案

今天我也在为同样的问题苦苦挣扎(因为我是 Asp.Identity 的新手,所以仍在努力解决).我是这样做的:

Today I was struggling with the same issue (still working on it since I'm new to Asp.Identity). I did it this way:

  1. Startup.cs(使用您自己的容器)

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var authConfigurator = new AuthConfigurator();
        authConfigurator.ConfigureAuth(app);
        var unityContainer = UnityConfig<MvcUnityDependencyContainer>.UseContainer();
        //Asp identity registration
        IDataProtectionProvider dataProtectionProvider = app.GetDataProtectionProvider();
        unityContainer.RegisterInstance(dataProtectionProvider);
        unityContainer.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager());
        unityContainer.RegisterType<UserManager<ApplicationUser, int>>(new HierarchicalLifetimeManager());
        unityContainer.RegisterType IIdentityMessageService, EmailService>();
        unityContainer.RegisterType<IUserStore<ApplicationUser, int>,
            UserStore<ApplicationUser, CustomRole, int, CustomUserLogin, CustomUserRole, CustomUserClaim>>(
            new InjectionConstructor(new ApplicationDbContext()));
        unityContainer.RegisterType<IIdentityMessageService, EmailService>();
    }
}

  • ApplicationUserManager(我删除了静态方法 Create):

    public class ApplicationUserManagerService : UserManager<ApplicationUser, int>
    {
        public ApplicationUserManagerService(IUserStore<ApplicationUser, int> store, 
                                             IIdentityMessageService emailService,
                                             IDataProtectionProvider dataProtectionProvider)
                                             : base(store)
        {
            UserTokenProvider = new EmailTokenProvider<ApplicationUser, int>();
            EmailService = emailService;
            Configure(dataProtectionProvider);
        }
        private void Configure(IDataProtectionProvider dataProtectionProvider)
        {
            // Configure validation logic for usernames
            UserValidator = new UserValidator<ApplicationUser, int>(this)
            {
                AllowOnlyAlphanumericUserNames = false,
                RequireUniqueEmail = true
            };
            // Configure validation logic for passwords
            PasswordValidator = new PasswordValidator
            {
                RequiredLength = 1,
                RequireNonLetterOrDigit = false,
                RequireDigit = false,
                RequireLowercase = false,
                RequireUppercase = false,
            };
            // Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user
            // You can write your own provider and plug in here.
            RegisterTwoFactorProvider("PhoneCode", new PhoneNumberTokenProvider<ApplicationUser, int>
            {
                MessageFormat = "Your security code is: {0}"
            });
            RegisterTwoFactorProvider("EmailCode", new EmailTokenProvider<ApplicationUser, int>
            {
                Subject = "Security Code",
                BodyFormat = "Your security code is: {0}"
            });
            if (dataProtectionProvider != null)
            {
                UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser, int>(dataProtectionProvider.Create("ASP.NET Identity"));
            }
        }
    }
    

  • 控制器

    public class AccountController : Controller
    {
        private ApplicationUserManagerService _userManagerService;
        public AccountController(ApplicationUserManagerService userManagerService)
        {
            Contract.Requires(userManagerService != null);
            _userManagerService = userManagerService;
        }
        /*....*/
    }
    

  • 应用程序用户

    public class ApplicationUser : IdentityUser<int, CustomUserLogin, CustomUserRole, CustomUserClaim>
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, int> manager)
        {
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            return userIdentity;
        }
    }
    
    public class CustomRole : IdentityRole<int, CustomUserRole>
    {
        public CustomRole() { }
        public CustomRole(string name) { Name = name; }
    }
    
    public class CustomUserClaim : IdentityUserClaim<int> { }
    public class CustomUserLogin : IdentityUserLogin<int> { }
    public class CustomUserRole : IdentityUserRole<int> { }
    

  • 这对我有用,但请随时提出更好的解决方案.

    This works for me but please feel free to suggest better solution.

    这篇关于AspIdentiy ApplicationUserManager 是静态的,如何扩展使其参与我的 IoC 框架?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

    本文标题为:AspIdentiy ApplicationUserManager 是静态的,如何扩展使

    基础教程推荐