2015-12-07 16 views
5

Sto cercando di passare al mio controller della RoleManager come UserManager, ma ho questo errore:ASP.NET vNext 5 Dipendenze Injection (RoleManager)

An unhandled exception occurred while processing the request.

InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNet.Identity.RoleManager`1[Web.MongoDBIdentitySample.Models.ApplicationRole]' while attempting to activate 'Web.MongoDBIdentitySample.Controllers.AccountController'.

Questo è il mio metodo ConfigureServices:

// This method gets called by the runtime. Use this method to add services to the container. 
    public void ConfigureServices(IServiceCollection services) 
    { 
     // Registers MongoDB conventions for ignoring default and blank fields 
     // NOTE: if you have registered default conventions elsewhere, probably don't need to do this 
     RegisterClassMap<ApplicationUser, IdentityRole, string>.Init(); 

     // Add Mongo Identity services to the services container. 
     services.AddIdentity<ApplicationUser, IdentityRole>() 
      .AddMongoDBIdentityStores<ApplicationDbContext, ApplicationUser, IdentityRole, string>(options => 
      { 
       options.ConnectionString = Configuration["Data:DefaultConnection:ConnectionString"];  // No default, must be configured if using (eg "mongodb://localhost:27017") 
       // options.Client = [IMongoClient];         // Defaults to: uses either Client attached to [Database] (if supplied), otherwise it creates a new client using [ConnectionString] 
       // options.DatabaseName = [string];         // Defaults to: "AspNetIdentity" 
       // options.Database = [IMongoDatabase];        // Defaults to: Creating Database using [DatabaseName] and [Client] 

       // options.UserCollectionName = [string];       // Defaults to: "AspNetUsers" 
       // options.RoleCollectionName = [string];       // Defaults to: "AspNetRoles" 
       // options.UserCollection = [IMongoCollection<TUser>];    // Defaults to: Creating user collection in [Database] using [UserCollectionName] and [CollectionSettings] 
       // options.RoleCollection = [IMongoCollection<TRole>];    // Defaults to: Creating user collection in [Database] using [RoleCollectionName] and [CollectionSettings] 
       // options.CollectionSettings = [MongoCollectionSettings];   // Defaults to: { WriteConcern = WriteConcern.WMajority } => Used when creating default [UserCollection] and [RoleCollection] 

       // options.EnsureCollectionIndexes = [bool];      // Defaults to: false => Used to ensure the User and Role collections have been created in MongoDB and indexes assigned. Only runs on first calls to user and role collections. 
       // options.CreateCollectionOptions = [CreateCollectionOptions];  // Defaults to: { AutoIndexId = true } => Used when [EnsureCollectionIndexes] is true and User or Role collections need to be created. 
       // options.CreateIndexOptions = [CreateIndexOptions];    // Defaults to: { Background = true, Sparse = true } => Used when [EnsureCollectionIndexes] is true and any indexes need to be created. 
      }) 
      .AddDefaultTokenProviders(); 

     services.AddIdentity<ApplicationRole, IdentityRole>() 
      .AddMongoDBIdentityStores<ApplicationDbContext, ApplicationUser, IdentityRole, string>(options => 
      { 
       options.ConnectionString = Configuration["Data:DefaultConnection:ConnectionString"];  // No default, must be configured if using (eg "mongodb://localhost:27017") 
                              // options.Client = [IMongoClient];         // Defaults to: uses either Client attached to [Database] (if supplied), otherwise it creates a new client using [ConnectionString] 
                              // options.DatabaseName = [string];         // Defaults to: "AspNetIdentity" 
                              // options.Database = [IMongoDatabase];        // Defaults to: Creating Database using [DatabaseName] and [Client] 

       // options.UserCollectionName = [string];       // Defaults to: "AspNetUsers" 
       // options.RoleCollectionName = [string];       // Defaults to: "AspNetRoles" 
       // options.UserCollection = [IMongoCollection<TUser>];    // Defaults to: Creating user collection in [Database] using [UserCollectionName] and [CollectionSettings] 
       // options.RoleCollection = [IMongoCollection<TRole>];    // Defaults to: Creating user collection in [Database] using [RoleCollectionName] and [CollectionSettings] 
       // options.CollectionSettings = [MongoCollectionSettings];   // Defaults to: { WriteConcern = WriteConcern.WMajority } => Used when creating default [UserCollection] and [RoleCollection] 

       // options.EnsureCollectionIndexes = [bool];      // Defaults to: false => Used to ensure the User and Role collections have been created in MongoDB and indexes assigned. Only runs on first calls to user and role collections. 
       // options.CreateCollectionOptions = [CreateCollectionOptions];  // Defaults to: { AutoIndexId = true } => Used when [EnsureCollectionIndexes] is true and User or Role collections need to be created. 
       // options.CreateIndexOptions = [CreateIndexOptions];    // Defaults to: { Background = true, Sparse = true } => Used when [EnsureCollectionIndexes] is true and any indexes need to be created. 
      }) 
      .AddDefaultTokenProviders(); 

     // Add MVC services to the services container. 
     services.AddMvc(); 

     // Add application services. 
     services.AddTransient<IEmailSender, AuthMessageSender>(); 
     services.AddTransient<ISmsSender, AuthMessageSender>(); 
    } 

Questa è la mia classe AccountController:

public class AccountController : Controller 
    { 
     private readonly UserManager<ApplicationUser> _userManager; 
     private readonly RoleManager<ApplicationRole> _roleManager; 
     private readonly SignInManager<ApplicationUser> _signInManager; 
     private readonly IEmailSender _emailSender; 
     private readonly ISmsSender _smsSender; 
     private readonly ILogger _logger; 

     public AccountController(
      UserManager<ApplicationUser> userManager, 
      RoleManager<ApplicationRole> roleManager, 
      SignInManager<ApplicationUser> signInManager, 
      IEmailSender emailSender, 
      ISmsSender smsSender, 
      ILoggerFactory loggerFactory) 
     { 
      _userManager = userManager; 
      _roleManager = roleManager; 
      _signInManager = signInManager; 
      _emailSender = emailSender; 
      _smsSender = smsSender; 
      _logger = loggerFactory.CreateLogger<AccountController>(); 
     } 
} 

EDIT: Aggiunto il mio Appli Classe cationRole:

public class ApplicationUser : IdentityUser 
{ 
} 

public class ApplicationDbContext : IdentityDatabaseContext<ApplicationUser, ApplicationRole, string> 
{ 
} 

public class ApplicationRole : IdentityRole 
{ 

} 

Delle idee come iniettare questo? Grazie!!

risposta

8

Stai specificando IdentityRole invece di ApplicationRole quando si chiama services.AddIdentity<ApplicationUser, IdentityRole>(), che registra RoleManager<IdentityRole> ma non il RoleManager<ApplicationRole> il controller account utilizza.

Sostituire IdentityRole da ApplicationRole nel metodo ConfigureServices e dovrebbe funzionare:

services.AddIdentity<ApplicationUser, ApplicationRole>() 
     .AddMongoDBIdentityStores<ApplicationDbContext, ApplicationUser, ApplicationRole, string>(); 
+0

Hi @Pinpoint, è una soluzione non funziona ... lo stesso errore. – chemitaxis

+0

Sì, lo farò;) – chemitaxis

+0

IdentityRole modificato da ApplicationRole nel contesto db risolto il mio problema anche usando il tuo codice;) grazie – chemitaxis

Problemi correlati