业务层之间的DBContext

时间:2017-09-22 16:43:04

标签: c# asp.net entity-framework asp.net-web-api

我创建了两个项目:

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'.

1 个答案:

答案 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,而无需修改控制器的任何内容,因为控制器将通过接口使用存储库