【发布时间】:2021-09-02 17:33:25
【问题描述】:
我有使用 Microsoft 标识的应用程序我的模型是 应用用户
public class ApplicationUser : IdentityUser
{
public string Notes { get; set; }
public string DisplayName { get; set; }
public string Firstname { get; set; }
public string MiddleName { get; set; }
public string Lastname { get; set; }
public string Gender { get; set; }
public string ProfilePic { get; set; }
public string Birthday { get; set; }
public bool IsProfileComplete { get; set; }
public bool Terms { get; set; }
public bool IsEmployee { get; set; }
public string UserRole { get; set; }
public DateTime AccountCreatedOn { get; set; }
public bool RememberMe { get; set; }
public bool IsActive { get; set; }
public ICollection<Address> UserAddresses { get; set; }
}
我的上下文是
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, IdentityRole, string>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.ApplyConfigurationsFromAssembly(typeof(ApplicationUserConfiguration).Assembly);
builder.ApplyConfigurationsFromAssembly(typeof(AddressConfigurations).Assembly);
}
public DbSet<ApplicationUser> ApplicationUsers { get; set; }
public DbSet<Address> Addresses { get; set; }
}
我的启动文件是
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();
services.AddScoped<ISeedData, SeedData>();
我正在像这样在 program.cs 中播种数据
public static async Task Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var seedData = services.GetRequiredService<ISeedData>();
var context = services.GetRequiredService<ApplicationDbContext>();
await DbInitializer.DataBaseInitialize(seedData, context);
}
catch (Exception ex)
{
Log.Error("An error occurred while seeding database {Error} {StackTrace} {InnerException} {Source}", ex.Message, ex.StackTrace, ex.InnerException, ex.Source);
}
}
await host.RunAsync();
}
我的存储库接口是 ISeedData 和实现 SeedData
私有只读 UserManager _userManager; 私有只读 RoleManager _roleManager;
public SeedData(UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager)
{
_userManager = userManager;
_roleManager = roleManager;
}
public async Task CreateAdminUser()
{}
但是当我运行我的应用程序时,我收到了这个错误
Unhandled exception. System.AggregateException: Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: CMS_DataAccessService.IRepository.ISeedData Lifetime: Scoped ImplementationType: CMS_DataAccessService.Repository.SeedData': Unable to resolve service for type 'Microsoft.AspNetCore.Identity.UserManager`1[CMS_ModelsServices.Models.ApplicationUser]' while attempting to activate 'CMS_DataAccessService.Repository.SeedData'.)
---> System.InvalidOperationException: Error while validating the service descriptor 'ServiceType: CMS_DataAccessService.IRepository.ISeedData Lifetime: Scoped ImplementationType: CMS_DataAccessService.Repository.SeedData': Unable to resolve service for type 'Microsoft.AspNetCore.Identity.UserManager`1[CMS_ModelsServices.Models.ApplicationUser]' while attempting to activate 'CMS_DataAccessService.Repository.SeedData'.
---> System.InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.Identity.UserManager`1[CMS_ModelsServices.Models.ApplicationUser]' while attempting to activate 'CMS_DataAccessService.Repository.SeedData'.
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(Type serviceType, Type implementationType, CallSiteChain callSiteChain, ParameterInfo[] parameters, Boolean throwIfCallSiteNotFound)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(ResultCache lifetime, Type serviceType, Type implementationType, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(ServiceDescriptor descriptor, Type serviceType, CallSiteChain callSiteChain, Int32 slot)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.GetCallSite(ServiceDescriptor serviceDescriptor, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.ValidateService(ServiceDescriptor descriptor)
--- End of inner exception stack trace ---
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.ValidateService(ServiceDescriptor descriptor)
at Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(IEnumerable`1 serviceDescriptors, IServiceProviderEngine engine, ServiceProviderOptions options)
--- End of inner exception stack trace ---
at Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(IEnumerable`1 serviceDescriptors, IServiceProviderEngine engine, 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 CMS.Program.Main(String[] args) in E:\Projects\CMS\CMS\Program.cs:line 24
at CMS.Program.<Main>(String[] args)
【问题讨论】:
-
我想我错了。我删除了之前的评论。我在想,即使它是相同的例外,引用的副本也可能在这里不适用。您似乎已在启动时正确注册了该类型,但尝试在
services.ServiceProvider的服务中使用(解析类型)确实是这个问题的范围。据推测,您在控制器中解析这些类型不会有问题。 -
我无法重现此错误。在
Main函数范围内,它使用使用这些类型的示例构造函数解析为SeedData(和context)的实例。您能否验证CMS_ModelsServices.Models.ApplicationUser是在您的启动文件范围中引用和使用的类型。你能从你的启动文件中提供整个ConfigureServices范围吗?你能指定你正在使用什么目标框架(我的目标是net5),并包括依赖包及其版本。 -
你可以在github.com/adelanwer12/CMS找到完整的代码
标签: c# entity-framework-core asp.net-identity