Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET 5 vNext Dependencies Injection (RoleManager)

I'm trying to pass to my controller the RoleManager like UserManager, but I have this error:

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'.

This is my ConfigureServices method:

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

This is my AccountController class:

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: Added my ApplicationRole class:

public class ApplicationUser : IdentityUser
{
}

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

public class ApplicationRole : IdentityRole
{

}

Any ideas how to inject this? Thanks!!

like image 302
chemitaxis Avatar asked Dec 07 '15 10:12

chemitaxis


People also ask

Does ASP NET support dependency injection?

ASP.NET Core supports the dependency injection (DI) software design pattern, which is a technique for achieving Inversion of Control (IoC) between classes and their dependencies.

How does ASP NET dependency injection work?

Dependency Injection is the design pattern that helps us to create an application which loosely coupled. This means that objects should only have those dependencies that are required to complete tasks.

What is dependency injection in c# asp net?

Dependency injection in . NET is a built-in part of the framework, along with configuration, logging, and the options pattern. A dependency is an object that another object depends on. Examine the following MessageWriter class with a Write method that other classes depend on: C# Copy.


1 Answers

You're specifying IdentityRole instead of ApplicationRole when calling services.AddIdentity<ApplicationUser, IdentityRole>(), which registers RoleManager<IdentityRole> but not the RoleManager<ApplicationRole> your account controller is using.

Replace IdentityRole by ApplicationRole in your ConfigureServices method and it should work:

services.AddIdentity<ApplicationUser, ApplicationRole>()
        .AddMongoDBIdentityStores<ApplicationDbContext, ApplicationUser, ApplicationRole, string>();
like image 77
Kévin Chalet Avatar answered Sep 26 '22 20:09

Kévin Chalet