2017-08-21 23 views
12

özel Rollerle DI hataları: MS tarafından tavsiye edildiğiASP.NET Core 2 - Kimlik - Ben Startup.cs Bu kodu var

services.AddDbContext<ApplicationDbContext>(options => 
      options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

     services.AddIdentity<ApplicationUser, ApplicationRole>() 
      .AddEntityFrameworkStores<ApplicationDbContext>() 
      .AddDefaultTokenProviders(); 

Aynı dosyada, ben de app.UseAuthentication(); ile service.UseIdentity() yerini ASP Çekirdeği yeni sürümü 2.

benim Db Bağlam:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string> 
{ 
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) 
     : base(options) 
    { 
    } 

    protected override void OnModelCreating(ModelBuilder builder) 
    { 
     base.OnModelCreating(builder); 
     // Customize the ASP.NET Identity model and override the defaults if needed. 
     // For example, you can rename the ASP.NET Identity table names and more. 
     // Add your customizations after calling base.OnModelCreating(builder); 
    } 


    //public DbSet<ApplicationUser> ApplicationUser { get; set; } 

    //public DbSet<ApplicationRole> ApplicationRole { get; set; } 
} 

Ve özel Rol sınıfı:

public class ApplicationRole : IdentityRole 
{ 
    public ApplicationRole() : base() { } 

    public ApplicationRole(string roleName) : base(roleName) { } 

    public bool IsDefault { get; set; } 
} 
uygulamayı çalıştırırken, ben çalışan bir SeedDatabase yardımcı yöntemi var

:

var roleManager = serviceProvider.GetService<RoleManager<ApplicationRole>>(); 

Bu tüm iyi çalışıyor, ancak .NET Çekirdek 2.0 en son sürüme VS 2017 güncellenmesi ve yükleme beri, bu son

System.AggregateException occurred 
HResult=0x80131500 
Message=One or more errors occurred. (Cannot resolve scoped service 'Microsoft.AspNetCore.Identity.RoleManager`1[CspLicensingPortal.Models.ApplicationRole]' from root provider.) 
Source=<Cannot evaluate the exception source> 
StackTrace: 
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) 
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) 
at System.Threading.Tasks.Task.Wait() 
at CspLicensingPortal.Startup.Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) in D:\gsandorx\Documents\Visual Studio 2017\Projects\CspLicensingPortal\CspLicensingPortal\Startup.cs:line 275 

Inner Exception 1: 
InvalidOperationException: Cannot resolve scoped service 'Microsoft.AspNetCore.Identity.RoleManager`1[MyApplication.Models.ApplicationRole]' from root provider. 

Ben DI hizmet yöneticisi artık benim ApplicationRole sınıfını bulmak mümkün olmasının nedeni emin değilim: kod satırının şimdi şu istisna atar. Kontrol ettim ve tüm referanslarım bu sınıfı kullanıyor ve varsayılan IdentityRole'u kullanmıyor.

Herhangi bir fikrin var mı?

cevap

15

IServiceScope'u kendiniz oluşturmanız gerekir.

sahip bu

IServiceScopeFactory scopeFactory = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>(); 

using (IServiceScope scope = scopeFactory.CreateScope()) { 
    RoleManager<IdentityRole> roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>(); 

    // Seed database code goes here 
} 
+2

teşekkür ile

var roleManager = serviceProvider.GetService<RoleManager<ApplicationRole>>(); 

yerine yapmak için! Sanırım 2.0 bir sürü şey değişti ve orada belgeler hala çocuk bezi var :) – Bmelca

+1

Çocuk bezi değil, çöp tenekesi gibi. .NET Core ekibinde en son sürümle birlikte hayal kırıklığına uğradım. Zavallı zavallı. – Keith

+0

@Manos, bu cevap için çok teşekkürler. Çılgın şey şu ki, .NET Core ekibinin, tek bir kod satırı gerektiren bir işlevi gerçekleştirmek için daha fazla kod satırı eklemenin akıllıca olacağını düşündüğü zaman, ağzımda biraz kustum. Yine, bu yüzden hayal kırıklığına uğradım (yukarıdaki yorumuma göre) – Keith