gpt4 book ai didi

asp.net-mvc - 在Controller中使用依赖注入(inject)和存储库模式时如何处理业务规则?

转载 作者:行者123 更新时间:2023-12-02 17:43:34 25 4
gpt4 key购买 nike

因此,99% 使用 MVC(或 Web API)存储库模式的 DI 示例在 Controller 操作中显示了与下面类似的内容(省略了 _repository 的构造函数注入(inject)代码)。问题是假设不需要首先处理任何内容(如规则)并立即开始持久化:

public ActionResult Create(Person person)
{
if (ModelState.IsValid)
{
_repository.Add(person);
}

return View(person);
}

问题是,如果我需要在持久化 person 对象之前在域层处理规则怎么办?显然我不在 Controller 中执行该逻辑,而是在域层中需要它。以下哪个选项更好:

选项 1:将存储库上的所有持久性详细信息降级为在域/业务层中调用并从 Controller 中拉出。更新后的代码如下所示:

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 的薄型,然后将注入(inject)的 _repository 传递到需要它的层。

如果有任何帮助,我们将不胜感激,谢谢!

最佳答案

这两个选项都会创建对业务逻辑处理器的依赖,在使用 new 关键字时必须小心,因为当您尝试对方法进行单元测试时,几乎总是会遇到问题,这违背了依赖注入(inject)的目的。

您最好创建一个处理复杂业务逻辑的服务并将其注入(inject)到您的 Controller 中。如果您的大部分逻辑都很复杂,我会跳过将存储库全部传递给 Controller ​​,而仅依赖服务来为我处理所有事情。

Controller :

public MyController(IPersonService personService) 
{
_personService = personService;
}

public ActionResult Create(Person person)
{
if (ModelState.IsValid)
_personService.Create(person);
else
......
}

人员服务:

public PersonService(IPersonRepository repo) 
{
_repo = repo;
}

public int Create(Person person)
{
//businesslogic
return _repo.Add(person);
}

关于asp.net-mvc - 在Controller中使用依赖注入(inject)和存储库模式时如何处理业务规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14324609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com