将数据库上下文从控制器传递到模型的最佳方法
本文关键字:模型 最佳 方法 数据库 上下文 控制器 | 更新日期: 2023-09-27 18:21:35
我读了很多关于IoC和设计模式的文章,但我找不到明确的答案。我在模型中进行整个数据管理,所以我也在模型中创建数据库上下文,但我从Benjamin Gale那里找到了一个解决方案-我应该什么时候创建一个我喜欢的新DbContext(),它解决了我共享数据库上下文的很多问题,但我的问题是,如何将这个上下文从控制器传递到模型?当我有这样的ActionResult:
[Authorize, HttpPost]
public ActionResult AccountEditation(AccountEditationModel accountEditation)
{ ... }
在AccountEditionactionResult中应用setter注入将是一个很好的解决方案,这在每个actionResult方法中都是平均值:
[Authorize, HttpPost]
public ActionResult AccountEditation(AccountEditationModel accountEditation)
{
accountEditation.db = Database; //Database from BaseController
...
}
或者有其他方法可以做到这一点吗?
尽管有这个名字,ASP.NET MVC只是松散地遵循MVC模式。也就是说,没有真正的模型。相反,您的模型将是您的实体、表示该实体和DAL的视图模型的组合,但每一个都应该是单独的东西。在实体类中创建甚至注入上下文是完全不合适的。
您的DAL将是上下文的唯一所有者。您应该有一个表示应用程序可以使用的API的接口。然后,你应该有一个或多个该接口的实现,每个离散的数据访问方法(实体框架、WebApi等)一个。然后,你将把你的上下文注入这个实现,并把这个实现注入你的控制器。控制器本身应该只引用接口。这就是所谓的提供者模式,它允许您根据需要在不同的访问方法中进行sub。决定使用Dapper而不是实体框架?只需为Dapper创建一个新的实现并注入它;代码的其余部分都不需要更改。
我发现的最简单的事情是通过Unity将存储库注入控制器。然后,如果需要,将存储库传递给用于处理业务逻辑的任何服务或类。
基本上。。。
public class AccountController : Controller
{
private IRepository<Account> _accountRepository;
public AccountController(IRepository<Account> accountRepository)
{
this._accountRepository = accountRepository;
}
}
当你使用Unity并正确设置它时,你可以自动将你正在使用的任何存储库注入到AccountController类中。之后,将同一个存储库传递给其他需要它的服务或类应该不会有问题
Unity依赖注入