Ошибка при попытке подключения к базе данных SQL Server - PullRequest
0 голосов
/ 29 декабря 2018

Я новичок в .NET Core.При подключении к базе данных SQL Server появляется сообщение об ошибке:

Не удается разрешить службу для типа 'MVC_Core.Business.Repo' при попытке активировать 'MVC_Core.Controllers.AbcController.

Мой StartUp.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<DbContext>(options =>
              options.UseSqlServer(Configuration.GetConnectionString("BloggingDatabase")));
    services.AddTransient<IRepo,Repo>();
}

Application.js:

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    },
    "ConnectionStrings": {
      "BloggingDatabase": "Data Source=MD\\MD;Initial Catalog=Ems_local;User ID=sa;Password=123"
    }
  },
  "AllowedHosts": "*"
}

Мой DbContext:

public class ConnectToDb : DbContext
{
        //public DbConnection(){}

        public ConnectToDb(DbContextOptions<ConnectToDb> options) : base(options)
        {
        }

        public virtual DbSet<Country> Country { get; set; }
    }

Это соединение я вызываю так:

public class Repo : IRepo
{
        private ConnectToDb db = null;

        public Repo(ConnectToDb _db)
        {
            db = _db;
        }

Пока я вызываю это в моем контроллере как

Repo ObjRepo;

public AbcController(Repo _objRepo)
{
    ObjRepo = _objRepo;
}

[Route("Hello")]
public IActionResult Index()
{
    var x = ObjRepo.GetCountry();
    return Json("abc" + x);
}

Пожалуйста, сообщите мне - почему я получаю эту ошибку?

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

У вас две проблемы с внедрением зависимостей в ASP.NET Core .

Когда вы вызываете метод AddTransient, вы добавляете новую службу типа, указанного в параметре первого типа, с типом реализации, указанным во втором.Это позволяет вам использовать службу как зависимость без указания ее реализации.

Вы зарегистрировали класс Repo в качестве реализации для интерфейса IRepo, а затем должны использовать интерфейс для разрешенияit:

public AbcController(IRepo _objRepo)

Aslo, AddDbContext - это метод расширения для регистрации DbContext и инфраструктуры EF в качестве службы, и он работает аналогичным образом.Вот важная часть реализации для вашего примера:

// TContextService is the type parameter
serviceCollection.TryAdd(new ServiceDescriptor(typeof(TContextService), typeof(TContextService), ServiceLifetime.Scoped));

Это означает, что в serviceCollection добавляется новый сервис типа TContextService с типом реализации TContextService.

Итак, вам нужно исправить регистрацию для вашего DbContext с определенным именем класса в качестве универсального параметра, чтобы разрешить его в классе Repo:

services.AddDbContext<ConnectToDb>(options =>
          options.UseSqlServer(Configuration.GetConnectionString("BloggingDatabase")));
0 голосов
/ 29 декабря 2018

Ваша регистрация в IRepo.Вам нужно изменить приведенный ниже код с Repo на IRepo

IRepo ObjRepo;
public AbcController(IRepo _objRepo)
{
    ObjRepo = _objRepo;
}

, кроме того, вам необходимо использовать ConnectToDb DbContext в качестве интерфейса при регистрации DbContext

 services.AddDbContext<ConnectToDb>(options => options.UseSqlServer(
    Configuration.GetConnectionString("BloggingDatabase")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...