System.AggregateException в Program.cs в ASP. NET Core MVC - PullRequest
1 голос
/ 31 марта 2020

У меня есть ASP. NET Core MVC приложение, которое использует Entity Framework Core O / RM. Я реализую шаблон репозитория generi c в моем приложении. Есть две сущности, Employee & Department. Существует один класс контекста EmployeeDepartmentDetails. Существует интерфейс IGenericRepository, который реализуется GenericRepository. GenericRepository имеет внедрение зависимостей EmployeeDepartmentDetails. Мой контроллер EmployeeController имеет внедрение зависимостей IGenericRepository.

IGenericRepository.cs -

public interface IGenericRepository<TEntity> where TEntity : class
{
    //...
}

GenericRepository.cs - Здесь EmployeeDepartmentDetails - это мой контекстный класс, который наследует DBContext class-

public class GenericRepository<TEntity> :IGenericRepository<TEntity> where TEntity : class
{
    DbSet<TEntity> _dbSet;
    // Dependency Injection 
    private readonly EmployeeDepartmentDetail _employeeDepartmentDetail; 
    public GenericRepository(EmployeeDepartmentDetail employeeDepartmentDetail)
    {
        _employeeDepartmentDetail = employeeDepartmentDetail;
        _dbSet = _employeeDepartmentDetail.Set<TEntity>();
    } 

    //... 
}

Program.cs -

public static void Main(string[] args)
{
    CreateHostBuilder(args).Build().Run(); // I am getting those two exceptions here
}

StartUp.cs -

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddScoped(typeof(IGenericRepository<Type>), typeof(GenericRepository<Type>)); 
}

EmployeeController .cs -

public class EmployeeController : Controller
{
    private readonly IGenericRepository<Employee> _genericRepository;
    public EmployeeController(IGenericRepository<Employee> genericRepository)
    {
        _genericRepository = genericRepository;
    } 

    //... 
}

Когда я запускаю приложение, я получаю два исключения -

System.AggregateException HResult = 0x80131500 Сообщение = Некоторые службы не могут быть построены (Ошибка при проверке дескриптора службы 'ServiceType: InfrastructureLayer.GenericRepository.Interface.IGenericRepository 1[System.Type] Lifetime: Scoped ImplementationType: InfrastructureLayer.GenericRepository.Implementation.GenericRepository 1 [System.Type]': подходящий конструктор для типа 'InfrastructureLayer.GenericRepository.Implementation.GenericRepository 1[System.Type]' could not be located. Ensure the type is concrete and services are registered for all parameters of a public constructor.) Source=Microsoft.Extensions.DependencyInjection StackTrace:at Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(IEnumerable optionsPoDescriptOccessServiceOzitorSourceSider в Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider (IServiceCollection services, S Варианты erviceProviderOptions) в Microsoft.Extensions.DependencyInjection.DefaultServiceProviderFactory.CreateServiceProvider (IServiceCollection containerBuilder) в Microsoft.Extensions.Hosting.Internal.ServiceFactoryAdapter`1.CreateServiceProvider (containerBuilder Object) в Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider () в Microsoft. Extensions.Hosting.HostBuilder.Build () в CrudEfCore.Program.Main (String [] args) в C: \ Users \ singh \ Desktop \ MVC \ GenericRepository \ CrudEfCore \ Program.cs: строка 16 Это исключение было первоначально сгенерировано в этом стеке вызовов: [Внешний код]

Внутреннее исключение 1: InvalidOperationException: Ошибка при проверке дескриптора службы 'ServiceType: InfrastructureLayer.GenericRepository.Interface.IGenericRepository 1[System.Type] Lifetime: Scoped ImplementationType: InfrastructureLayer.GenericRepository.Implementation.GenericRepository 1 [System.Type]': подходящий конструктор для типа 'InfrastructureLayer.GenericRepository.Implementation.GenericRepository`1 [System.Type]' не найден. Убедитесь, что тип конкретный, а службы зарегистрированы для всех параметров конструктора publi c.

Внутреннее исключение 2: InvalidOperationException: подходящий конструктор для типа 'InfrastructureLayer.GenericRepository.Implementation.GenericRepository`1 [System. Тип] 'не может быть найден. Убедитесь, что тип конкретный, а службы зарегистрированы для всех параметров конструктора publi c.

Я не могу понять исключение, я не знаю, что я делаю здесь неправильно. Я знаю, что вставил много кода, но даже не знаю, как объяснить исключение.

1 Ответ

1 голос
/ 31 марта 2020

Это является причиной проблемы

services.AddScoped(typeof(IGenericRepository<Type>), typeof(GenericRepository<Type>)); 

Type является абстрактным классом и, как говорится в сообщении об ошибке:

Убедитесь, что тип concrete и службы зарегистрированы для всех параметров publi c конструктор .

примечание: выделено мое

Далее Type не то, что Вы должны использовать в качестве аргумента generi c при регистрации службы generi c

. В этом случае вы можете зарегистрироваться с использованием (generi c) открытых типов, исключая необходимость регистрации каждого (generi *) 1030 *) тип конструкции:

services.AddScoped(typeof(IGenericRepository<>), typeof(GenericRepository<>)); 

Ссылка Внедрение зависимостей в ASP. NET Core

...