在一个新的ASPNET MVC应用程序中,您现在可以免费得到AspIdentity的好东西.
这里有一个无害的小线’插入你的电子邮件服务’.
所以我做了:
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中调用Create on ApplicationUserManager:
public partial class Startup { public void ConfigureAuth(IAppBuilder app) { ... app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
因为我正在使用AutoFac作为我的IoC容器,在global.asax.cs中
builder.RegisterType<My.Services.EmailService>().As<IEmailService>();
如果Create方法是静态的,我得到:
_emailService为空
我看过这里:http://forums.asp.net/post/5293670.aspx和How do i create an instance of UserManager和Using Autofac to provide types exported by static factory.
但没有运气.
如果我改变:
private My.Services.IEmailService _emailservice;
被公开的非静态我感觉到IoC的神摇头,我不能建立“对象引用必需”
解决方法
今天我正在努力解决同样的问题(自从我刚开始接受Asp.Identity之后,我仍在努力工作).
我这样做:
我这样做:
> 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; } /*....*/ }
> ApplicationUser
public class ApplicationUser : IdentityUser<int,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> { }
这适用于我,但请随时提出更好的解决方案.