我是.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);
}
请指导我-为什么会出现此错误?
答案 0 :(得分:2)
dependency injection in ASP.NET Core有两个问题。
调用AddTransient
方法时,将添加第一个type参数中指定类型的新服务和第二个中指定的实现类型。它允许您将服务用作依赖项,而无需指定其实现。
您已经将registered类Repo
作为接口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")));