尚未注册类型 <TYPE> 的服务

Rom*_*lin 2 c# dependency-injection asp.net-core razor-pages

我正在开发一个 asp.net 核心 mvc 项目,并尝试将一个数据库对象注入到视图中,以便在视图中从中检索一些东西。

我将该类注入到 startup.cs 中并使用了 @inject,但仍然出现异常。

InvalidOperationException: 没有注册“DbServices.CredentialDb”类型的服务。

Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
Run Code Online (Sandbox Code Playgroud)

这是 Startup.cs ConfigureServices 方法:

Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
Run Code Online (Sandbox Code Playgroud)

这是我添加数据库访问类的地方:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddIdentity<ApplicationUser, IdentityRole>(
        options => options.User.AllowedUserNameCharacters = null)
        .AddEntityFrameworkStores<AppDbContext>();
    services.AddControllersWithViews();
    services.AddDbContextPool<AppDbContext>(
        options => options.UseSqlServer(
            _config.GetConnectionString("AutoLoverDbConnection"), 
            x => x.MigrationsAssembly("AutoMatcherProjectAss"))
        .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
    services.AddSingleton<ISessionManager, ClientSIdeSessionManager>();
    services.AddHttpContextAccessor();
    services.AddSession();
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies
        // is needed for a given request.
        options.CheckConsentNeeded = context => false;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });
    services.AddDistributedMemoryCache();
    services.AddSession(options =>
    {
        options.IdleTimeout = TimeSpan.FromMinutes(60); //You can set Time   
        options.Cookie.HttpOnly = true;
    });
    services.AddTransient<ISche, SchedulerImpl>();
    services.AddTransient<IQueue, QueueImpl>();
    services.AddTransient<SchedulerJob>();
    services.AddTransient<IBotFactory, BotFactory>();
    services.AddTransient<ICredentialDb, CredentialDb>();
    services.AddSingleton(provider => _scheduler);
    services.AddAuthentication().AddFacebook(options =>
    {
        options.AppId = APP_ID;
        options.AppSecret = APP_SECRET;
        options.SaveTokens = true;
    });
    _scheduler.Clear();
}
Run Code Online (Sandbox Code Playgroud)

这些是 HTML 视图页面中的注入:

@using Microsoft.AspNetCore.Identity;
@using DbServices

@inject CredentialDb DataAccess
@inject UserManager<ApplicationUser> signIn
Run Code Online (Sandbox Code Playgroud)

Vad*_*nov 6

问题是使用接口注入和具体类来解决它。

services.AddTransient<ICredentialDb, CredentialDb>();
Run Code Online (Sandbox Code Playgroud)

AddTransient(IServiceCollection)向指定的 IServiceCollection添加类型为ICredentialDbi 实现类型的瞬态服务CredentialDb。您可以按服务类型解析您的服务,如下面的代码所示:

@inject ICredentialDb DataAccess
Run Code Online (Sandbox Code Playgroud)