Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将数据库上下文从控制器传递到模型的最佳方法_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

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

C# 将数据库上下文从控制器传递到模型的最佳方法,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我读了很多关于国际奥委会和设计模式的书,但我没有找到明确的答案。我在模型中进行完整的数据管理,所以我也在模型中创建数据库上下文,但我从Benjamin Gale-那里找到了一个解决方案,我很喜欢,它解决了共享数据库上下文的一系列问题,但我的问题是,如何将此上下文从控制器传递到模型? 当我有这样的结果时: [Authorize, HttpPost] public ActionResult AccountEditation(AccountEditationModel accountE

我读了很多关于国际奥委会和设计模式的书,但我没有找到明确的答案。我在模型中进行完整的数据管理,所以我也在模型中创建数据库上下文,但我从Benjamin Gale-那里找到了一个解决方案,我很喜欢,它解决了共享数据库上下文的一系列问题,但我的问题是,如何将此上下文从控制器传递到模型? 当我有这样的结果时:

    [Authorize, HttpPost]
    public ActionResult AccountEditation(AccountEditationModel accountEditation)
    { ... }
在AccountEdition actionResult中应用setter注入是一个很好的解决方案,这意味着在每个actionResult方法中:

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

或者还有其他方法吗?

我发现最简单的方法是通过Unity将存储库注入控制器。然后,如果需要,将存储库传递给处理业务逻辑所使用的任何服务或类

基本上

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

   public AccountController(IRepository<Account> accountRepository)
   {
      this._accountRepository = accountRepository;
   }
}
公共类AccountController:控制器
{

私有IRepository

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


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

您的模型(也称为ViewModels)应该是简单的数据容器,并且不需要上下文。如果您需要使用上下文加载或保存数据的方法,请不要将其添加到视图模型中,而是在单独的类中创建。一些人将其称为服务,其他人将其称为模型(显然与ViewModel不同).看。把这个和@Chris Pratt的答案结合起来,你就可以走了!