When I try to run my code error are displayed as (Some services are not able to be constructed)
Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory
1[Proj.Core.Models.UserManagment.User] Lifetime: Scoped ImplementationType: Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory
1[Proj.Core.Models.UserManagment.User]': Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IUserStore1[Proj.Core.Models.UserManagment.User]' while attempting to activate 'Microsoft.AspNetCore.Identity.UserManager
1[Proj.Core.Models.UserManagment.User]'.) (Error while validating the service descriptor 'ServiceType: Microsoft.AspNetCore.Identity.UserManager1[Proj.Core.Models.UserManagment.User] Lifetime: Scoped ImplementationType: Microsoft.AspNetCore.Identity.UserManager
1[Proj.Core.Models.UserManagment.User]': Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IUserStore1[Proj.Core.Models.UserManagment.User]' while attempting to activate 'Microsoft.AspNetCore.Identity.UserManager
1[Proj.Core.Models.UserManagment.User]'.)
System.AggregateException
HResult=0x80131500
Message=Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory`1[Proj.Core.Models.UserManagment.User] Lifetime: Scoped ImplementationType: Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory`1[Proj.Core.Models.UserManagment.User]': Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IUserStore`1[Proj.Core.Models.UserManagment.User]' while attempting to activate 'Microsoft.AspNetCore.Identity.UserManager`1[Proj.Core.Models.UserManagment.User]'.) (Error while validating the service descriptor 'ServiceType: Microsoft.AspNetCore.Identity.UserManager`1[Proj.Core.Models.UserManagment.User] Lifetime: Scoped ImplementationType: Microsoft.AspNetCore.Identity.UserManager`1[Proj.Core.Models.UserManagment.User]': Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IUserStore`1[Proj.Core.Models.UserManagment.User]' while attempting to activate 'Microsoft.AspNetCore.Identity.UserManager`1[Proj.Core.Models.UserManagment.User]'.)
Source=Microsoft.Extensions.DependencyInjection
StackTrace:
at Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(ICollection`1 serviceDescriptors, ServiceProviderOptions options)
at Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(IServiceCollection services, ServiceProviderOptions options)
at Microsoft.Extensions.DependencyInjection.DefaultServiceProviderFactory.CreateServiceProvider(IServiceCollection containerBuilder)
at Microsoft.Extensions.Hosting.Internal.ServiceFactoryAdapter`1.CreateServiceProvider(Object containerBuilder)
at Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()
at Microsoft.Extensions.Hosting.HostBuilder.Build()
at Microsoft.AspNetCore.Builder.WebApplicationBuilder.Build()
at Program.<Main>$(String[] args) in C:\Users\user1\source\repos\Proj.E-Invoice\Proj.E-Invoice\Program.cs:line 37
This exception was originally thrown at this call stack:
[External Code]
Inner Exception 1:
InvalidOperationException: Error while validating the service descriptor 'ServiceType: Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory`1[Proj.Core.Models.UserManagment.User] Lifetime: Scoped ImplementationType: Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory`1[Proj.Core.Models.UserManagment.User]': Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IUserStore`1[Proj.Core.Models.UserManagment.User]' while attempting to activate 'Microsoft.AspNetCore.Identity.UserManager`1[Proj.Core.Models.UserManagment.User]'.
Inner Exception 2:
InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.Identity.IUserStore`1[Proj.Core.Models.UserManagment.User]' while attempting to activate 'Microsoft.AspNetCore.Identity.UserManager`1[Proj.Core.Models.UserManagment.User]'.
When I try to remove this code the project will run successfully..
IdentityBuilder identityBuilder = builder.Services.AddIdentityCore<User>(pass =>
{
pass.Password.RequireDigit = true;
pass.Password.RequiredLength = 8;
pass.Password.RequireNonAlphanumeric = true;
pass.Password.RequireUppercase = true;
pass.Password.RequireLowercase = true;
pass.User.RequireUniqueEmail = true;
});
Program.cs
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Identity;
using Microsoft.DotNet.Scaffolding.Shared.ProjectModel;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Text;
using Proj.Core;
using Proj.Core.IRepositories;
using Proj.Core.Models.UserManagment;
using Proj.EF;
using Proj.EF.Seed;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
string conStr = builder.Configuration.GetConnectionString("DefaultConnection") ??
throw new Exception("Connection string not defined!");
builder.Services.AddDbContext<DataContext>(options => options.UseSqlServer(conStr, b => b.MigrationsAssembly(typeof(DataContext).Assembly.FullName)));
IdentityBuilder identityBuilder = builder.Services.AddIdentityCore<User>(pass =>
{
pass.Password.RequireDigit = true;
pass.Password.RequiredLength = 8;
pass.Password.RequireNonAlphanumeric = true;
pass.Password.RequireUppercase = true;
pass.Password.RequireLowercase = true;
pass.User.RequireUniqueEmail = true;
});
//builder.Services.AddTransient<ISeed, Seed>();
builder.Services.AddTransient<IUnitOfWork, UnitOfWork>();
var app = builder.Build();
//using (var obj = app.Services.CreateScope())
//{
// var services = obj.ServiceProvider;
// var seeder = services.GetRequiredService<Seed>();
// seeder.SeedRolesAndUsers();
//}
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
**DataContext class: ** DataContext.cs
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using Proj.Core.Models;
using Proj.Core.Models.UserManagment;
namespace Proj.EF
{
public class DataContext : IdentityDbContext<User, Role, long,
IdentityUserClaim<long>, UserRole, IdentityUserLogin<long>,
IdentityRoleClaim<long>, IdentityUserToken<long>>
{
public DataContext(DbContextOptions<DataContext> options) : base(options)
{
}
public DbSet<Company> Companies { get; set; }
public DbSet<Account> Accounts { get; set; }
public DbSet<City> Cities { get; set; }
public DbSet<Contact> Contacts { get; set; }
public DbSet<Country> Countries { get; set; }
public DbSet<Package> Packages { get; set; }
public DbSet<Product> Products { get; set; }
public DbSet<PackagesHistory> PackagesHistories { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Country>()
.HasMany(c => c.Cities)
.WithOne(c => c.Country)
.HasForeignKey(c => c.CountryId).OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<UserRole>(userRole =>
{
userRole.HasKey(ur => new { ur.UserId, ur.RoleId });
userRole.HasOne(ur => ur.Role)
.WithMany(r => r.UserRoles)
.HasForeignKey(ur => ur.RoleId)
.IsRequired();
userRole.HasOne(ur => ur.User)
.WithMany(r => r.UserRoles)
.HasForeignKey(ur => ur.UserId)
.IsRequired();
});
modelBuilder.Properties()
.Where(x => x.Name == "Id")
.Configure(p => p.SetColumnName("Id"));
modelBuilder.EntityTypes()
.ToList()
.ForEach(e => e.SetTableName(e.GetTableName()));
modelBuilder.Properties()
.Where(x => x.Name == "Id")
.Configure(p => p.SetIdentityIncrement(1));
modelBuilder.Properties()
.Where(x => x.Name == "Id")
.Configure(p => p.IsPrimaryKey());
#region Change Names For Tables
modelBuilder.Entity<User>(entity =>
{
entity.ToTable(name: "User");
});
modelBuilder.Entity<Role>(entity =>
{
entity.ToTable(name: "Role");
});
modelBuilder.Entity<UserRole>(entity =>
{
entity.ToTable("UserRoles");
});
modelBuilder.Entity<IdentityUserClaim<long>>(entity =>
{
entity.ToTable("UserClaims");
});
modelBuilder.Entity<IdentityUserLogin<long>>(entity =>
{
entity.ToTable("UserLogins");
});
modelBuilder.Entity<IdentityRoleClaim<long>>(entity =>
{
entity.ToTable("RoleClaims");
});
modelBuilder.Entity<IdentityUserToken<long>>(entity =>
{
entity.ToTable("UserTokens");
});
#endregion
}
}
Error Description:
This case resolved by doing the following steps:
1.In class Program.cs Replace this code
IdentityBuilder identityBuilder = builder.Services.AddIdentityCore<User>(pass =>
{
pass.Password.RequireDigit = true;
pass.Password.RequiredLength = 8;
pass.Password.RequireNonAlphanumeric = true;
pass.Password.RequireUppercase = true;
pass.Password.RequireLowercase = true;
pass.User.RequireUniqueEmail = true;
});
With:
IdentityBuilder identityBuilder = builder.Services.AddIdentity<User, Role>(pass =>
{
pass.Password.RequireDigit = true;
pass.Password.RequiredLength = 8;
pass.Password.RequireNonAlphanumeric = true;
pass.Password.RequireUppercase = true;
pass.Password.RequireLowercase = true;
pass.User.RequireUniqueEmail = true;
}).AddEntityFrameworkStores<DataContext>()
.AddDefaultTokenProviders();