Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 无法解析Microsoft.AspNetCore.Identity.RoleManager类型的服务_Asp.net Core_Microservices_Asp.net Core Webapi_Asp.net Core 3.1_Asp.net Core Identity - Fatal编程技术网

Asp.net core 无法解析Microsoft.AspNetCore.Identity.RoleManager类型的服务

Asp.net core 无法解析Microsoft.AspNetCore.Identity.RoleManager类型的服务,asp.net-core,microservices,asp.net-core-webapi,asp.net-core-3.1,asp.net-core-identity,Asp.net Core,Microservices,Asp.net Core Webapi,Asp.net Core 3.1,Asp.net Core Identity,我正在使用微服务体系结构进行项目工作,我使用ASP.NET核心标识作为单独的微服务来创建用户和角色。我使用自定义字段扩展用户和角色,并在API项目的startup.cs中配置标识。但是当我运行我的应用程序时,我得到了如下错误: 有些服务无法构建(验证服务描述符“ServiceType:Microservice.IdentityMS.Application.Interfaces.IIIdentityMs服务生命周期:临时实现类型:Microservice.IdentityMS.Applicatio

我正在使用微服务体系结构进行项目工作,我使用ASP.NET核心标识作为单独的微服务来创建用户和角色。我使用自定义字段扩展用户和角色,并在API项目的startup.cs中配置标识。但是当我运行我的应用程序时,我得到了如下错误:

有些服务无法构建(验证服务描述符“ServiceType:Microservice.IdentityMS.Application.Interfaces.IIIdentityMs服务生命周期:临时实现类型:Microservice.IdentityMS.Application.Services.IdentityMSService”时出错:无法解析类型“Microsoft.AspNetCore.Identity.RoleManager”1的服务。)[Microservice.IdentityMS.Domain.Models.MembershipRole],,同时尝试激活“Alexa.IdentityMS.Data.Repository.IdentityMSRepository”。)

这是我的Identity Microservice初创公司

Startup.cs

using Microservice.IdentityMS.Data.Context;
using Microservice.IdentityMS.Domain.Models;
using Microservice.Infra.IoC;
using MediatR;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.OpenApi.Models;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Microservice.Identity.Api
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();           
            var userConnectionString = Configuration["DbContextSettings:UserConnectionString"];
            var dbPassword = Configuration["DbContextSettings:DbPassword"];           
            var userBuilder = new NpgsqlConnectionStringBuilder(userConnectionString)
            {
                Password = dbPassword
            };

            services.AddDbContext<MembershipDBContext>(opts => opts.UseNpgsql(builder.ConnectionString));
            services.AddDbContext<UserDBContext>(opts => opts.UseNpgsql(userBuilder.ConnectionString));

            services.AddIdentity<MembershipUser, MembershipRole>(options =>
            {
                options.Password.RequiredLength = 8;
                options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+ ";
                options.SignIn.RequireConfirmedEmail = false;
            }).AddRoles<MembershipRole>().AddEntityFrameworkStores<MembershipDBContext>()
            .AddDefaultTokenProviders();            

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "Identity Microservice", Version = "v1" });
            });
            services.AddMediatR(typeof(Startup));
            RegisterServices(services);
        }
        private void RegisterServices(IServiceCollection services)
        {
            DependencyContainer.RegisterServices(services);
        }
        
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "Identity Microservice V1");
            });
            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}
using MediatR;
using Microservices.Domain.Core.Bus;
using Microservices.Infra.Bus;
using Microsoft.Extensions.DependencyInjection;
using Microservices.ProductMS.Domain.Interfaces;
using Microservices.ProductMS.Data.Repository;
using Microservices.ProductMS.Data.Context;
using Microservices.ProductMS.Application.Interfaces;
using Microservices.ProductMS.Application.Services;
using Microservices.PartyMS.Application.Interfaces;
using Microservices.PartyMS.Application.Services;
using Microservices.PartyMS.Domain.Interfaces;
using Microservices.PartyMS.Data.Repository;
using Microservices.PartyMS.Data.Context;
using Microservices.MasterMS.Application.Interfaces;
using Microservices.MasterMS.Application.Services;
using Microservices.MasterMS.Domain.Interfaces;
using Microservices.MasterMS.Data.Repository;
using Microservices.MasterMS.Data.Context;
using Microservices.MasterMS.Domain.Commands;
using Microservices.MasterMS.Domain.CommandHandler;
using Microservices.ProductMS.Domain.Commands;
using Microservices.ProductMS.Domain.CommandHandler;
using Microservices.PartyMS.Domain.CommandHandler;
using Microservices.AccountMS.Application.Interfaces;
using Microservices.AccountMS.Application.Services;
using Microservices.AccountMS.Domain.Interfaces;
using Microservices.AccountMS.Data.Repository;
using Microservices.AccountMS.Data.Context;
using Microservices.SalesPurchaseMS.Domain.Interfaces;
using Microservices.SalesPurchaseMS.Data.Repository;
using Microservices.SalesPurchaseMS.Data.Context;
using Microservices.SalesPurchaseMS.Application.Interfaces;
using Microservices.SalesPurchaseMS.Application.Services;
using Microservices.IdentityMS.Application.Interfaces;
using Microservices.IdentityMS.Application.Services;
using Microservices.IdentityMS.Domain.Interfaces;
using Microservices.IdentityMS.Data.Repository;
using Microservices.IdentityMS.Data.Context;
using Microsoft.AspNetCore.Identity;
using Microservices.IdentityMS.Domain.Models;

namespace Microservices.Infra.IoC
{
    public class DependencyContainer
    {
        public static void RegisterServices(IServiceCollection services)
        {
            //Domain Bus
            services.AddSingleton<IEventBus, RabbitMQBus>(sp =>
            {
                var scopeFactory = sp.GetRequiredService<IServiceScopeFactory>();
                return new RabbitMQBus(sp.GetService<IMediator>(), scopeFactory);
            });

            //Subscriptions
            services.AddTransient<ProductMS.Domain.EventHandler.CompanyEventHandler>();
            services.AddTransient<PartyMS.Domain.EventHandler.CompanyEventHandler>();
            

            //Domain Events
            services.AddTransient<IEventHandler<ProductMS.Domain.Events.CompanyEvent>, ProductMS.Domain.EventHandler.CompanyEventHandler>();
            services.AddTransient<IEventHandler<PartyMS.Domain.Events.CompanyEvent>, PartyMS.Domain.EventHandler.CompanyEventHandler>();
            //services.AddTransient<IEventHandler<SalesMS.Domain.Events.CompanyEvent>, SalesMS.Domain.EventHandler.CompanyEventHandler>();
            //services.AddTransient<IEventHandler<SalesMS.Domain.Events.PartyEvent>, SalesMS.Domain.EventHandler.PartyEventHandler>();

            //Domain Commands
            services.AddTransient<IRequestHandler<CompanySyncCommand, bool>, CompanySyncCommandHandler>();
            services.AddTransient<IRequestHandler<ProductSyncCommand, bool>, ProductSyncCommandHandler>();
            services.AddTransient<IRequestHandler<ProductCategorySyncCommand, bool>, ProductCategorySyncCommandHandler>();
            services.AddTransient<IRequestHandler<PartySyncCommand, bool>, PartySyncCommandHandler>();

            //Application Services            
            services.AddTransient<IMasterService, MasterService>();
            services.AddTransient<IProductService, ProductService>();
            services.AddTransient<IPartyMSService, PartyMSService>();
            //services.AddTransient<IPurchaseService, PurchaseService>();
            services.AddTransient<IPurchaseService, PurchaseService>();
            services.AddTransient<ISaleService, SaleService>();//SaleMS
            services.AddTransient<IAccountMSService, AccountMSService>();
            services.AddTransient<IIdentityMSService, IdentityMSService>();
            services.AddTransient<IAdministrationService, AdministrationService>();

            //Data            
            services.AddTransient<IMasterRepository, MasterRepository>();
            services.AddTransient<MasterDbContext>();

            services.AddTransient<IProductRepository, ProductRepository>();
            services.AddTransient<ProductsDBContext>();
            
            services.AddTransient<IPartyMSRepository, PartyMSRepository>();
            services.AddTransient<PartyMSDBContext>();

            services.AddTransient<IPurchaseRepository, PurchaseRepository>();
            services.AddTransient<ISaleRepository, SaleRepository>();
            services.AddTransient<SPDBContext>();


            services.AddTransient<IAccountMSRepository, AccountMSRepository>();
            services.AddTransient<AccountDbContext>();

            services.AddTransient<IIdentityMSRepository, IdentityMSRepository>();
            services.AddTransient<IAdministrationRepository, AdministrationRepository>();//IdentityMS
            services.AddTransient<UserDBContext>();
        }
    }
}
public class IdentityMSRepository : IIdentityMSRepository
{
    private readonly UserDBContext _userContext;
    private readonly RoleManager<MembershipRole> _roleManager;
    private readonly UserManager<MembershipUser> _userManager;

    public IdentityMSRepository(UserDBContext userContext, RoleManager<MembershipRole> roleManager, UserManager<MembershipUser> userManager)
    {
        _userContext = userContext;
        _roleManager = roleManager;
        _userManager = userManager;
    }
}
IdentityMSRepository.cs

using Microservice.IdentityMS.Data.Context;
using Microservice.IdentityMS.Domain.Models;
using Microservice.Infra.IoC;
using MediatR;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.OpenApi.Models;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Microservice.Identity.Api
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();           
            var userConnectionString = Configuration["DbContextSettings:UserConnectionString"];
            var dbPassword = Configuration["DbContextSettings:DbPassword"];           
            var userBuilder = new NpgsqlConnectionStringBuilder(userConnectionString)
            {
                Password = dbPassword
            };

            services.AddDbContext<MembershipDBContext>(opts => opts.UseNpgsql(builder.ConnectionString));
            services.AddDbContext<UserDBContext>(opts => opts.UseNpgsql(userBuilder.ConnectionString));

            services.AddIdentity<MembershipUser, MembershipRole>(options =>
            {
                options.Password.RequiredLength = 8;
                options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+ ";
                options.SignIn.RequireConfirmedEmail = false;
            }).AddRoles<MembershipRole>().AddEntityFrameworkStores<MembershipDBContext>()
            .AddDefaultTokenProviders();            

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "Identity Microservice", Version = "v1" });
            });
            services.AddMediatR(typeof(Startup));
            RegisterServices(services);
        }
        private void RegisterServices(IServiceCollection services)
        {
            DependencyContainer.RegisterServices(services);
        }
        
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "Identity Microservice V1");
            });
            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}
using MediatR;
using Microservices.Domain.Core.Bus;
using Microservices.Infra.Bus;
using Microsoft.Extensions.DependencyInjection;
using Microservices.ProductMS.Domain.Interfaces;
using Microservices.ProductMS.Data.Repository;
using Microservices.ProductMS.Data.Context;
using Microservices.ProductMS.Application.Interfaces;
using Microservices.ProductMS.Application.Services;
using Microservices.PartyMS.Application.Interfaces;
using Microservices.PartyMS.Application.Services;
using Microservices.PartyMS.Domain.Interfaces;
using Microservices.PartyMS.Data.Repository;
using Microservices.PartyMS.Data.Context;
using Microservices.MasterMS.Application.Interfaces;
using Microservices.MasterMS.Application.Services;
using Microservices.MasterMS.Domain.Interfaces;
using Microservices.MasterMS.Data.Repository;
using Microservices.MasterMS.Data.Context;
using Microservices.MasterMS.Domain.Commands;
using Microservices.MasterMS.Domain.CommandHandler;
using Microservices.ProductMS.Domain.Commands;
using Microservices.ProductMS.Domain.CommandHandler;
using Microservices.PartyMS.Domain.CommandHandler;
using Microservices.AccountMS.Application.Interfaces;
using Microservices.AccountMS.Application.Services;
using Microservices.AccountMS.Domain.Interfaces;
using Microservices.AccountMS.Data.Repository;
using Microservices.AccountMS.Data.Context;
using Microservices.SalesPurchaseMS.Domain.Interfaces;
using Microservices.SalesPurchaseMS.Data.Repository;
using Microservices.SalesPurchaseMS.Data.Context;
using Microservices.SalesPurchaseMS.Application.Interfaces;
using Microservices.SalesPurchaseMS.Application.Services;
using Microservices.IdentityMS.Application.Interfaces;
using Microservices.IdentityMS.Application.Services;
using Microservices.IdentityMS.Domain.Interfaces;
using Microservices.IdentityMS.Data.Repository;
using Microservices.IdentityMS.Data.Context;
using Microsoft.AspNetCore.Identity;
using Microservices.IdentityMS.Domain.Models;

namespace Microservices.Infra.IoC
{
    public class DependencyContainer
    {
        public static void RegisterServices(IServiceCollection services)
        {
            //Domain Bus
            services.AddSingleton<IEventBus, RabbitMQBus>(sp =>
            {
                var scopeFactory = sp.GetRequiredService<IServiceScopeFactory>();
                return new RabbitMQBus(sp.GetService<IMediator>(), scopeFactory);
            });

            //Subscriptions
            services.AddTransient<ProductMS.Domain.EventHandler.CompanyEventHandler>();
            services.AddTransient<PartyMS.Domain.EventHandler.CompanyEventHandler>();
            

            //Domain Events
            services.AddTransient<IEventHandler<ProductMS.Domain.Events.CompanyEvent>, ProductMS.Domain.EventHandler.CompanyEventHandler>();
            services.AddTransient<IEventHandler<PartyMS.Domain.Events.CompanyEvent>, PartyMS.Domain.EventHandler.CompanyEventHandler>();
            //services.AddTransient<IEventHandler<SalesMS.Domain.Events.CompanyEvent>, SalesMS.Domain.EventHandler.CompanyEventHandler>();
            //services.AddTransient<IEventHandler<SalesMS.Domain.Events.PartyEvent>, SalesMS.Domain.EventHandler.PartyEventHandler>();

            //Domain Commands
            services.AddTransient<IRequestHandler<CompanySyncCommand, bool>, CompanySyncCommandHandler>();
            services.AddTransient<IRequestHandler<ProductSyncCommand, bool>, ProductSyncCommandHandler>();
            services.AddTransient<IRequestHandler<ProductCategorySyncCommand, bool>, ProductCategorySyncCommandHandler>();
            services.AddTransient<IRequestHandler<PartySyncCommand, bool>, PartySyncCommandHandler>();

            //Application Services            
            services.AddTransient<IMasterService, MasterService>();
            services.AddTransient<IProductService, ProductService>();
            services.AddTransient<IPartyMSService, PartyMSService>();
            //services.AddTransient<IPurchaseService, PurchaseService>();
            services.AddTransient<IPurchaseService, PurchaseService>();
            services.AddTransient<ISaleService, SaleService>();//SaleMS
            services.AddTransient<IAccountMSService, AccountMSService>();
            services.AddTransient<IIdentityMSService, IdentityMSService>();
            services.AddTransient<IAdministrationService, AdministrationService>();

            //Data            
            services.AddTransient<IMasterRepository, MasterRepository>();
            services.AddTransient<MasterDbContext>();

            services.AddTransient<IProductRepository, ProductRepository>();
            services.AddTransient<ProductsDBContext>();
            
            services.AddTransient<IPartyMSRepository, PartyMSRepository>();
            services.AddTransient<PartyMSDBContext>();

            services.AddTransient<IPurchaseRepository, PurchaseRepository>();
            services.AddTransient<ISaleRepository, SaleRepository>();
            services.AddTransient<SPDBContext>();


            services.AddTransient<IAccountMSRepository, AccountMSRepository>();
            services.AddTransient<AccountDbContext>();

            services.AddTransient<IIdentityMSRepository, IdentityMSRepository>();
            services.AddTransient<IAdministrationRepository, AdministrationRepository>();//IdentityMS
            services.AddTransient<UserDBContext>();
        }
    }
}
public class IdentityMSRepository : IIdentityMSRepository
{
    private readonly UserDBContext _userContext;
    private readonly RoleManager<MembershipRole> _roleManager;
    private readonly UserManager<MembershipUser> _userManager;

    public IdentityMSRepository(UserDBContext userContext, RoleManager<MembershipRole> roleManager, UserManager<MembershipUser> userManager)
    {
        _userContext = userContext;
        _roleManager = roleManager;
        _userManager = userManager;
    }
}
public class IdentityMSRepository:IIdentityMSRepository
{
私有只读UserDBContext\u userContext;
专用只读角色管理器(RoleManager);
私有只读用户管理器_UserManager;
公共标识存储(UserDBContext userContext、RoleManager RoleManager、UserManager UserManager)
{
_userContext=userContext;
_roleManager=roleManager;
_userManager=userManager;
}
}

我遗漏了什么?

最后我做了更改,因为评论建议我将它从DI容器移动到启动文件,并且它工作正常。@Rena非常感谢。

它在我的项目中工作得很好。如何将
DependencyContainer
中的服务直接移动到启动文件,而不是使用
DependencyContainer.RegisterServices(服务)
?如果它运行良好,请共享您的
DependencyContainer
。DependencyContainer还包含其他微服务repo和服务,这就是为什么我将它作为单独的类项目保留的原因。@Rena您有什么想法吗?我仍然坚持这样做。实际上没有。我将它们放在其他类项目中,但仍然运行良好。试试其他生活怎么样me,
services.AddSingleton();
AddTransient