我创建了两个项目:
Web项目,包含所有视图模型/数据/控制器等。以及 Web Api 项目,允许表单捕获。
我只想捕获 web Api 中的数据,并将其保存到前端可以访问的数据库中。
我在 Api 控制器中初始化 DBcontext 时遇到问题,需要帮助。
namespace ZebraCRM.API2.Controllers
{
[Route("api/[controller]")]
public class LeadsController : Controller
{
private readonly ApplicationDbContext _context;
public LeadController(ApplicationDbContext context)
{
_context = context;
}
// POST api/values
[HttpPost]
public void Post(Lead formData)
{
formData.DateCreated = DateTime.Now;
_context.Lead.Add(formData);
_context.SaveChanges();
}
}
上述想法来自主Web项目中的控制器,但在这种情况下显然不是正确的方法。
调试输出以下
System.InvalidOperationException: Unable to resolve service for type 'ZebraCRM.Web.Data.ApplicationDbContext' while attempting to activate 'ZebraCRM.API2.Controllers.LeadsController'.
答案 0 :(得分:1)
框架不知道如何构造一个LeadController
,因为它在调用构造函数时不知道如何满足ApplicationDbContext context
参数。要解决这个问题,您可以简单地将值作为构造函数的一部分进行分配,从而消除参数。
namespace ZebraCRM.API2.Controllers
{
[Route("api/[controller]")]
public class LeadsController : Controller
{
private readonly ApplicationDbContext _context;
public LeadController()
{
_context = new ApplicationDbContext();
}
// POST api/values
[HttpPost]
public void Post(Lead formData)
{
formData.DateCreated = DateTime.Now;
_context.Lead.Add(formData);
_context.SaveChanges();
}
}
}
或者,如果您确实想要保留构造函数参数,则需要一个DI容器,例如AutoFac或Ninject。如果您是DI的新手,我建议您观看this video。当您为依赖注入设置时,您基本上会将一些内容传递给框架,该框架说“当构造一个需要X的对象时,这里是你给它一个X的方法”。这样您就可以更好地关注SOLID principles。一个对象可以要求一个IRepository(一个接口),作为你的DI设置的一部分,你可以说“当一个对象需要一个IRepository时,我想传递一个SqlServerRepository(它将实现IRepository)”。然后,如果您以后决定切换到MySQL,则可以修改设置以使用MySqlRepository
而不是SqlServerRepository
,而无需修改控制器的任何内容,因为控制器将通过接口使用存储库