将数据库上下文从控制器传递到模型的最佳方法

时间:2015-11-11 14:42:08

标签: c# asp.net-mvc entity-framework

我已经阅读了很多有关IoC和设计模式的内容,但我无法找到明确的答案。我正在模型中进行全数据管理,所以我也在模型中创建了数据库上下文,但是我找到了Benjamin Gale的解决方案 - When should I create a new DbContext(),我喜欢它并且它解决了我的共享问题db上下文,但我的问题是,如何将此上下文从控制器传递到模型? 当我有这样的ActionResult:

    [Authorize, HttpPost]
    public ActionResult AccountEditation(AccountEditationModel accountEditation)
    { ... }

在AccountEditation actionResult中应用setter注入是一个很好的解决方案,这意味着每个actionResult方法:

    [Authorize, HttpPost]
    public ActionResult AccountEditation(AccountEditationModel accountEditation)
    { 
    accountEditation.db = Database; //Database from BaseController
    ... 
    }

或者还有其他办法吗?

2 个答案:

答案 0 :(得分:1)

尽管有这个名字,ASP.NET MVC只是松散地遵循MVC模式。也就是说,没有真正的模型。相反,您的模型将是您的实体,代表该实体的视图模型和您的DAL的组合,但每个都应该是一个单独的东西。在实体类中创建甚至注入上下文是完全不合适的。

您的DAL将是上下文的唯一所有者。您应该有一个代表应用程序可以使用的API的接口。然后,您应该有一个或多个该接口的实现,每个谨慎的数据访问方法(实体框架,Web Api等)。然后,您将上下文注入此实现,并将实现注入您的控制器。控制器本身应该只引用接口。这就是所谓的提供者模式,它允许您根据需要使用不同的访问方法。决定你宁愿使用Dapper而不是实体框架?只需为Dapper创建一个新的实现,然后注入它;你的其余代码都不需要改变。

答案 1 :(得分:0)

我发现的最简单的事情是通过Unity向Controller注入一个存储库。然后,如果需要,将存储库传递给您用于处理业务逻辑的任何服务或类。

基本上...

public class AccountController : Controller
{
   private IRepository<Account> _accountRepository;

   public AccountController(IRepository<Account> accountRepository)
   {
      this._accountRepository = accountRepository;
   }
}

当您使用Unity并正确设置它时,您可以自动将您正在使用的任何存储库注入AccountController类。之后,将同一个存储库传递给需要它的其他服务或类应该没有问题。

Unity Dependency Injection