InvalidOperationException: невозможно разрешить службу для типа IRepository при попытке активировать UserSevice

Я создал приложение .NET Core 2.0 MVC и использовал шаблон внедрения зависимостей и репозитория, чтобы внедрить репозиторий в свой контроллер. Однако я получаю сообщение об ошибке, когда мой UserService собирается ввести в UserController:

InvalidOperationException: невозможно разрешить службу для типа «FFLEX.Services.Repository.IGenericRepository`1 [FFLEX.Core.ApplicationUser]» при попытке активировать «FFLEX.Services.User.UserService».

GenericRepository

public class GenericRepository<T> : IGenericRepository<T> where T : class {
    protected ApplicationDbContext _context;

    public GenericRepository(ApplicationDbContext context) {
        _context = context;
    }

    public IQueryable<T> GetAll() {
        return _context.Set<T>();
    }

    public virtual async Task<ICollection<T>> GetAllAsyn() {
        return await _context.Set<T>().ToListAsync();
    }
}

IUserService

public interface IUserService {
    Task<ICollection<ApplicationUser>> GetAllNonSuperAdminUsers();
}

UserService

public class UserService : IUserService {
    protected readonly IGenericRepository<ApplicationUser> _repository;

    public UserService(IGenericRepository<ApplicationUser> repository) {
        repository = repository;
   }

    public async Task<ICollection<ApplicationUser>> GetAllNonSuperAdminUsers() {
        return await _repository.GetAllAsyn();
    }
}

UserController

public class UserController : Controller {
    private readonly IUserService _userService;

    public UserController(IUserService userService) {
        userService = userService;
    }

    public async Task<IActionResult> Index() {
        var test = await PrepareUserViewModel();
        return View(test);
    }

    public async Task<UserViewModel> PrepareUserViewModel() {
        UserViewModel vm = new UserViewModel();
        vm.UserCount = 1;
        vm.Subscribers = 1;
        vm.Guest = 1;
        vm.Users = await _userService.GetAllNonSuperAdminUsers();
        return vm;
    }
}

Конфигурации Startup.cs

public void ConfigureServices(IServiceCollection services) {
    services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(FFLEXConsts.ConnectionString));

    services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

    // Add application services.
    services.AddTransient<IEmailSender, EmailSender>();
    //services.AddTransient<IUserService, UserService>();
    services.AddScoped<IUserService, UserService>();

    services.AddMvc();
}

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


person Abubakar Iftikhar    schedule 29.01.2018    source источник
comment
Я не вижу, что вы регистрируете IGenericRepository<ApplicationUser>, из-за ошибки кажется, что инжектор не может ее разрешить. По какой причине вы не регистрируете его в методе ConfigureServices?   -  person RMH    schedule 29.01.2018
comment
Вам не хватает services.AddScoped<IGenericRepository<ApplicationUser>, GenericRepository<ApplicationUser>>(); в вашем ConfigureServices методе.   -  person Cake or Death    schedule 29.01.2018
comment
@CalC Большое спасибо, это сработало :)   -  person Abubakar Iftikhar    schedule 29.01.2018


Ответы (2)


У меня такая же проблема. Я просто забыл добавить services.AddScoped<Internface,class> в свой startup.cs класс.

person Kahini    schedule 14.01.2021

У меня была такая же проблема при первом подходе к базе данных Entity Framework Core. Я выполнил следующие шаги и устранил ошибку.

Шаг 1. Убедитесь, что ваш конструктор класса контекста выглядит следующим образом

public partial class ZPHSContext : DbContext
{
    public ZPHSContext(DbContextOptions<ZPHSContext> dbContextOptions) : base(dbContextOptions)
    {
    }
}

Шаг 2: в файле Startup.cs зарегистрируйте свой класс контекста.

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddDbContext<ZPHSContext>(options => options.UseSqlServer(Configuration.GetConnectionString("BloggingDatabase")));
}

Шаг 3. Добавьте строку подключения в appsettings.json.

"ConnectionStrings": {
    "BloggingDatabase": "Server=Server=****;Database=ZPHSS;Trusted_Connection=True;"
}

Шаг 4. Удалите код по умолчанию из метода OnConfiguring в классе контекста.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
}
person karunakar bhogyari    schedule 14.03.2018