Почему Dependency Injection не знает о моем репо? - PullRequest
0 голосов
/ 02 мая 2018

У меня странная ситуация. Мне нужно использовать Entity Framework 6.2 для моего основного приложения .net.

Обычный контроллер

public class SampleApiController : BaseController
{
   // use _repo and other stuff
}

Базовый контроллер

public class BaseController : Controller
    {
        protected IRepo_repository;

        public BaseController(IRepo repository)
        {
            _repository = repository;
        }

        public BaseController() : this(null)
        {

        }
    }

Приложение DBContext

public class SampleContext : DbContext
    {
        public SampleContext(string connectionString)
            :base(connectionString)
        {
            try
            {   
                this.Database.Log = (s) => System.Diagnostics.Debug.Write(s);
            }
            catch (Exception e)
            {
                //CurrentLogger.Log.Error(e);
            }
        }

        public DbSet<Test1> Test1s { get; set; }
        public DbSet<Test2> Test2s { get; set; }
    }

Интерфейс репозитория

public interface IRepo
    {
// methods definition
}

Репозиторий класса

public interface Repo : IRepo
    {
// methods implementation
}

Startup.cs -> метод ConfigureServices

services.AddScoped<SampleContext>((s) => new SampleContext(configuration["ConnectionStrings:SampleApp"]));
        services.AddScoped<IRepo, Repo>();


На этом рисунке вы видите, что параметр хранилища пуст ... не инициализирован с экземпляром Repo ... (!!! На этом рисунке IRepo is IRepositoryBase)

enter image description here

Решение!

Как отмечали CodeNotFound и Riscie в комментариях, проблема заключалась в том, что BaseController был инициализирован нулем ... Спасибо, ребята!

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Обычно вы передаете IRepo от SampleApiController до BaseController.

Исходя из моего понимания, вам не нужен конструктор аргументов в BaseController. Если это так, вы можете удалить его, чтобы _repository не было null.

public class SampleApiController : BaseController
{
    public SampleApiController(IRepo repository) 
        : base(repository)
    {
    }
}

public class BaseController : Controller
{
    protected IRepo _repository;

    public BaseController(IRepo repository)
    {
        _repository = repository;
    }

    /*public BaseController() : this(null)
    {    
    }*/
}

public interface IRepo
{
    // methods definition
}
0 голосов
/ 02 мая 2018

Попробуйте это:

Интерфейс репозитория

public interface IRepo
{
    // methods definition
}

Класс репозитория Я изменил это с интерфейса на класс и заставил его реализовать Интерфейс IRepo

public class Repo : IRepo
{
    // methods implementation
}

Редактировать: Также удалить второй конструктор

public class BaseController : Controller
{
    protected IRepo_repository;

    public BaseController(IRepo repository)
    {
        _repository = repository;
    }

    //second constructor most likely introduces the problem
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...