【发布时间】:2017-03-18 20:14:07
【问题描述】:
我创建了一个使用 Web API 的项目。我想让控制器有一个构造函数,它接受构造函数注入的一个参数。在启动时,我添加了这个:
Startup.cs:
public class Startup
{
// Other codes ommitted
public void ConfigureServices(IServiceCollection services)
{
// Other codes ommitted
// Add application services.
services.AddTransient<IStudentDataAccess, StudentDataAccess>();
}
}
在控制器中,我有这个构造函数:
值控制器:
[Route("api/[controller]")]
public class ValuesController : Controller
{
private IStudentDataAccess _studentDataAccess;
public ValuesController(IStudentDataAccess studentDataAccess)
{
_studentDataAccess = studentDataAccess;
}
// GET: api/values
[HttpGet]
public IEnumerable<string> Get()
{
IStudentLogic studentLogic = new StudentLogic(_studentDataAccess);
return new string[] { "value1", "value2" };
}
}
但是构造函数没有被调用。我看到对于以前的 ASP.NET 版本,您可以这样做。如何在新的 ASP.NET 中执行此操作?或者 ASP.NET 解析 IStudentDataAccess 时如何传递参数?
更新:
好的,我认为问题在于我的 StudentDataAccess 类有一个接受 IDbContext 的非默认构造函数。如果我删除构造函数,它可以工作。但我需要能够在 StudentDataAccess 的构造函数中传递一个 IDbContext。我尝试在 ConfigureServices 中添加它:
services.AddTransient<IDbContext, TestDbContext>();
但是构造函数没有被断点击中。以下是 StudentDataAccess 的声明:
public class StudentDataAccess : IStudentDataAccess
{
private IDbContext _context;
public StudentDataAccess(IDbContext context)
{
_context = context;
}
}
IDbContext 只是一个没有成员的接口。
【问题讨论】:
-
它应该可以工作。您的控制器是从
Microsoft.AspNet.Mvc.Controller派生的吗?你有多个构造函数吗?你有minimal, complete and verifiable example吗? -
@Leonardo Herrera:不幸的是,事实并非如此。我不能在这里复制所有内容,但我所做的是默认的 Web API 模板,使用一个参数创建了一个新的构造函数,在其上放置了一个断点,然后运行它。它没有达到断点。
-
您可以创建一个 MCVE。显示您的控制器声明。
-
@mason:按照建议添加。
-
如果你在 get 方法的第一行放了一个断点,它会被命中吗?
标签: c# asp.net-core asp.net-core-mvc