因此,在使用 MVC(或 Web API)的 Repository 模式的所有 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。我喜欢保持控制器薄,只是将注入的 _repository 传递给需要它的层。
对此的任何帮助表示赞赏,谢谢!