Внедрение зависимостей - несколько проектов - PullRequest
0 голосов
/ 04 мая 2020

Я создаю wep api, и это текущая структура:

API - The Web API  (.net core web api project)
DAL - DbContext and Entities  (.net core class library)
DTO - Data Transfert Objects - The classes I send to the client without sensible data (.net core class library) 
REPO - Contains de Interfaces and Repositories (.net core class library) 

Для информации у меня было все в одном проекте, и я решил разбить его на несколько библиотек классов.
What I ' Вы сделали до сих пор:

  • Добавлены ссылки между каждым проектом
  • Обновления использования
  • Изменены имена пространств имен на правильные
  • Решение как 0 ошибки

Я думаю, что моя проблема связана с внедрением зависимости, потому что, когда я пытаюсь получить доступ к контроллеру из почтальона или из браузера, возникает эта ошибка:

InvalidOperationException: Ошибка при проверке дескриптора службы «ServiceType: FootballManager.REPO.ILeagueRepository Lifetime: Scoped ImplementType: FootballManager.REPO.LeagueRepository»: невозможно разрешить службу для типа «FootballManager.DAL.FootballManagerAPIContext» при попытке активировать «FootballMpositLanager.RE.

Мой Startup.cs выглядит так: * 10 23 *

using FootballManager.REPO;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace FootballManager.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.AddCors(options =>
            {
                options.AddDefaultPolicy(
                    builder =>
                    {
                        builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
                    });
            });

            services.AddControllers().AddNewtonsoftJson(options =>
                options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
            );

            services.AddScoped<ILeagueRepository, LeagueRepository>();
            services.AddScoped<IMatchRepository, MatchRepository>();
            services.AddScoped<IPlayerRepository, PlayerRepository>();
            services.AddScoped<IRefereeRepository, RefereeRepository>();
            services.AddScoped<ITeamRepository, TeamRepository>();

        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseCors();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

Это код моего контроллера, в который я делаю инъекцию:

public class LeaguesController : ControllerBase
    {
        private readonly ILeagueRepository _repo;

        public LeaguesController(ILeagueRepository repo)
        {
            _repo = repo;
        }

        [HttpGet]
        public async Task<ActionResult<IEnumerable<LeagueDto>>> GetLeagues()
        {
            return await _repo.GetAll();
        }
    }

Для моего соединения DbContext я сделал это непосредственно в проекте DAL, как это (я не думаю, что проблема здесь ):

public partial class FootballManagerAPIContext : DbContext
    {
        public FootballManagerAPIContext()
        {
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer(@"Server =.\SQLEXPRESS; Database = FootballManagerAPI; Trusted_Connection = True;");
            }
        }
}

После нескольких часов работы в Интернете и переполнения стека я все еще не могу найти какое-либо рабочее решение ...
Как я могу решить эту ошибку и почему у меня это происходит? Спасибо.

Ответы [ 3 ]

1 голос
/ 04 мая 2020

Вы никогда не создаете экземпляр своего DbContext - в этом очень явная ошибка;

Невозможно разрешить службу для типа 'FootballManager.DAL.FootballManagerAPIContext'

Вам также необходимо зарегистрировать DbContext, который вам нужен при запуске, включая конфигурацию

0 голосов
/ 04 мая 2020

Я не могу добавить комментарии к вашему вопросу, поэтому я оставляю это здесь:

Возможно, это глупый вопрос, но, может быть, вы забыли его:

Наследует ли LeagueRepository от ILeagueRepository?

0 голосов
/ 04 мая 2020

Я думаю, это поможет вам. Посмотрите это видео, в котором я объясняю, как реализовать внедрение зависимостей с помощью autofa c. https://studio.youtube.com/video/XvklkAj7qPg/edit

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

Проверьте, зарегистрирован ли вы контекст БД. services.AddDbContext (options => options.UseSqlServer (Configuration ["ConnectionStrings: DefaultConnection"]));

В конфигурации служб я не вижу его.

Спасибо, Ливиу

...