2014-05-09 15 views
10

Yeni bir ASPNET MVC uygulamasında artık AspIdentity güzelliklerini ücretsiz olarak edinebilirsiniz.AspIdentiy ApplicationUserManager Statiktir, nasıl genişletilir, böylece IoC çerçevemde yer alır?

Zararsız küçük bir satır 'e-posta hizmetinizi buraya takın'.

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); 
    } 
} 

ve şimdi sevinç:

Ve yaptım

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

İçinde Owin tekmeler olarak
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); 
     ... 

Startup.Auth.cs yılında ApplicationUserManager Oluştur çağırır

ve AutoFac ürününü IoC kapsayıcım olarak kullanıyorum. x.cs

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

oluştur yöntem statik ise

yüzden alıyorum: http://forums.asp.net/post/5293670.aspx ve How do i create an instance of UserManager ve Using Autofac to provide types exported by static factory:
_emailService boş

Burada baktım

olduğunu. ama şans yok.

Şunu değiştirirsem:

private My.Services.IEmailService _emailservice; 

Ben IoC tanrılar başlarını sallayarak hissediyorum statik olmayan herkese açık olmasını ve ben boğuşuyordu kurmak 'nesne referansı gereklidir'

cevap

6

Bugün olamaz Aynı sorun (hala Asp.Identity için yeni olduğum için üzerinde çalışıyor).

  1. Startup.cs (kendi kapsayıcı kullanmak)

    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>(); 
        } 
    } 
    
  2. ApplicationUserManager (ı statik yöntem oluşturun kaldırılan):

    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")); 
         } 
        } 
    } 
    
  3. Ben öyle yaptım
  4. Denetleyici

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

    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> { } 
    

Bu benim için çalışıyor ama daha iyi bir çözüm önermek çekinmeyin.

+0

Teşekkürler. Unity ve Autofac arasında dönüşüm yapmaya çalışacağım. – OzBob

+1

Şu anda derleyici hata veriyor: ... 'ApplicationUser' türü, 'Microsoft.AspNet.Identity.EmailTokenProvider ' yönteminde 'TUser' türünde parametre türü olarak kullanılamaz. 'ApplicationUser' ile 'Microsoft.AspNet.Identity.IUser ' arasında hiçbir dolaylı başvuru dönüşümü yoktur. IdentityModels.cs – OzBob

+0

için kaynağınızı yaptırabilirsiniz. – free4ride

2

Uzun bir süredir bununla savaştım ve sonunda en kolay şey bu oldu.

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 

yöntemin içinde

, bu kod satırları bulabilirsiniz. Ve buna göre değiştirin.

manager.EmailService = new EmailService(DependencyResolver.Current.GetService<Insolvency.Services.IEmailService>()); 

ben Servis Bulucu desen sevmiyorum ama MVC templated tüm kodu kullanır ve çerçeve mücadele en iyisidir.

container.RegisterType<ApplicationUserManager>(New InjectionFactory(x => HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>())); 

Bu zaten Startup.ConfigureAuth(IAppBuilder app) yılında OwinContext için yaratıldı ApplicationUserManager alır ve enjeksiyon için hazır hale getirir: Unity kullanma

0

, ben UnityConfig.cs içinde RegisterTypes(IUnityContainer container) için aşağıdaki eklendi. ApplicationUserManager'ın statik Create yöntemi de dahil olmak üzere her şeyi varsayılan ayarlarında tutabilirsiniz.

İlgili konular