Сервис для типа <TYPE>не зарегистрирован - PullRequest
0 голосов
/ 21 апреля 2020

Я работаю над проектом asp. net core mvc и пытаюсь внедрить объект базы данных в представление для извлечения чего-либо из него внутри представления.

Я внедрил класс в startup.cs и использовал @inject, но все равно получаю исключение.

InvalidOperationException: Служба для типа 'DbServices.CredentialDb' не зарегистрирована.

Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)

Это метод Startup.cs ConfigureServices:

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();
}

, где я добавил класс доступа к базе данных:

services.AddTransient<ICredentialDb, CredentialDb>();

, и это инъекции в представлении HTML страница:

@using Microsoft.AspNetCore.Identity;
@using DbServices

@inject CredentialDb DataAccess
@inject UserManager<ApplicationUser> signIn

1 Ответ

3 голосов
/ 21 апреля 2020

Проблема в том, чтобы использовать интерфейс для инъекций и конкретный класс для его решения.

services.AddTransient<ICredentialDb, CredentialDb>();

AddTransient (IServiceCollection) добавляет временную службу типа ICredentialDb с типом реализации CredentialDb к указанной IServiceCollection. Вы можете разрешить свою услугу по типу услуги, как показано в коде ниже:

@inject ICredentialDb DataAccess
...