【问题标题】:DBContext between business layers业务层之间的 DBContext
【发布时间】:2017-09-22 16:43:04
【问题描述】:

我创建了两个项目:

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

【问题讨论】:

  • 好的,那么您是否在任何地方设置了依赖注入?如果没有,构造函数注入将不起作用。您只需手动分配字段值并消除构造函数参数。
  • 没有设置依赖注入。你能举个例子吗?我还是有点困惑
  • 有大量关于 DI 的在线教程和许多框架可供选择。

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


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

【讨论】:

  • 我在“new ApplicationDbContext();”上遇到错误它看起来有些 DbContextOptions
  • @PowerMan2015 你必须比“错误”更具体。发布确切的错误消息。
  • 没有给定的参数对应于需要的形式参数'options'。这是在 VS 中,而不是在运行时
  • 好吧,然后在调用构造函数时传递一个选项实例。或者创建一个为您处理它的无参数构造函数。
  • 我希望我能通过它。我不知道它的用途或从哪里得到它。
猜你喜欢
  • 2021-02-11
  • 2011-12-27
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 2013-10-13
相关资源
最近更新 更多