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