【发布时间】:2013-01-14 18:47:45
【问题描述】:
因此,在所有使用 MVC(或 Web API)的存储库模式的 DI 示例中,99% 的示例在控制器操作中显示了与下面类似的内容(省略了 _repository 的构造函数注入代码)。问题是假设不需要首先处理任何内容(如规则)并且立即开始持久性:
public ActionResult Create(Person person)
{
if (ModelState.IsValid)
{
_repository.Add(person);
}
return View(person);
}
问题是,如果我需要在持久化person 对象之前在域层处理规则 怎么办?显然,我不在 Controller 中执行该逻辑,而是在域层中需要它。下面哪个选项更好:
选项 1: 将要在域/业务层调用的存储库上的所有持久性细节委托并从控制器中提取。更新后的代码如下所示:
if (ModelState.IsValid)
{
using (busniessLogic = new MyApp.BusniessLogic(_repository))
{
busniessLogic.ProcessRulesAndSavePerson(person);
}
}
领域层可能有这样的方法:
public void ProcessRulesAndSavePerson(Person person)
{
//process some rules...
if(rules = true)
{
//use injected repository to add now that rules have passed
_repository.Add(person)
}
}
选项 2: 在 Controller 中保持与现在相同,但只需在保存到存储库之前调用处理规则即可。更新后的代码如下:
if (ModelState.IsValid)
{
using (busniessLogic = new MyApp.BusniessLogic())
{
busniessLogic.ProcessRulesAboutPerson(person);
_repository.Add(person)
}
}
我也对其他想法持开放态度,但我倾向于选项 #1。我喜欢让 Controller 保持精简,然后将注入的 _repository 传递给需要它的层。
对此的任何帮助表示赞赏,谢谢!
【问题讨论】:
标签: asp.net-mvc dependency-injection repository-pattern