尝试连接到SQL Server数据库时出现错误

时间:2018-12-29 19:56:19

标签: c# asp.net-core

我是.NET Core的新手。连接到SQL Server数据库时,出现错误:

  

尝试激活'MVC_Core.Controllers.AbcController时无法解析'MVC_Core.Business.Repo'类型的服务

我的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 :(得分:2)

dependency injection in ASP.NET Core有两个问题。

调用AddTransient方法时,将添加第一个type参数中指定类型的新服务和第二个中指定的实现类型。它允许您将服务用作依赖项,而无需指定其实现。

您已经将registeredRepo作为接口IRepo的实现,然后应使用interface来解决它:

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")));

答案 1 :(得分:0)

您的注册在IRepo。您需要将以下代码从Repo更改为IRepo

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

除了在注册DbContext时需要使用ConnectToDb DbContext作为接口

 services.AddDbContext<ConnectToDb>(options => options.UseSqlServer(
    Configuration.GetConnectionString("BloggingDatabase")));