我已经阅读了很多有关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
...
}
或者还有其他办法吗?
答案 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类。之后,将同一个存储库传递给需要它的其他服务或类应该没有问题。