AspIdentiy ApplicationUserManager is Static, how to extend so it participates in my IoC framework?(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:
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 是静态的,如何扩展使
				
        
 
            
        基础教程推荐
- 全局 ASAX - 获取服务器名称 2022-01-01
 - JSON.NET 中基于属性的类型解析 2022-01-01
 - 从 VS 2017 .NET Core 项目的发布目录中排除文件 2022-01-01
 - 错误“此流不支持搜索操作"在 C# 中 2022-01-01
 - 在 VS2010 中的 Post Build 事件中将 bin 文件复制到物 2022-01-01
 - 经典 Asp 中的 ResolveUrl/Url.Content 等效项 2022-01-01
 - 如何动态获取文本框中datagridview列的总和 2022-01-01
 - 是否可以在 asp classic 和 asp.net 之间共享会话状态 2022-01-01
 - 首先创建代码,多对多,关联表中的附加字段 2022-01-01
 - 将事件 TextChanged 分配给表单中的所有文本框 2022-01-01
 
    	
    	
    	
    	
    	
    	
    	
    	
						
						
						
						
						
				
				
				
				