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

因此,使用带有MVC(或Web API)的Repository模式的所有DI示例中的99%在控制器动作中显示类似于此的内容(省略_repository的构造函数注入代码).问题在于假设不需要首先处理任何事情(如规则)并立即开始持久性:

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

    return View(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传递给需要它的层.

对此有任何帮助表示赞赏,谢谢!

解决方法

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

您最好创建一个处理复杂业务逻辑并将其注入控制器的服务.如果您的大多数逻辑都很复杂,我会跳过将存储库一起传递给控制器​​,并依赖服务来为我处理所有事情.

控制器:

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

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

PersonService:

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

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

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....