【问题标题】:Dependency Injection Error in asp.net core With Identity带有身份的asp.net核心中的依赖注入错误
【发布时间】: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


【解决方案1】:

您的代码库中有 2 个 ApplicationUser 类型。

您为依赖注入注册的是CMS_DataServices.Models.ApplicationUser

SeedData 构造函数中使用的是CMS_ModelsServices.Models.ApplicationUser

要解决,只需确保在两个方面都使用相同的类型。

services.AddIdentity<CMS_ModelsServices.Models.ApplicationUser, IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();
services.AddScoped<ISeedData, SeedData>();

【讨论】:

    猜你喜欢
    • 2018-01-03
    • 1970-01-01
    • 2019-02-16
    • 2018-08-30
    • 2021-02-06
    • 2021-01-09
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多