中律十六C 2024-05-22 10:05 采纳率: 0%
浏览 14

C#/ASP.NET 如何在一个服务层调用不同服务层里面的方法?

现在业务有一个需求,就是审批通过后自动下发任务,生成任务是在每个不同的服务层里面有对应的生成任务方法里面不单单要创建单据,而且还要调用框架的提交审批流程动作,现在就是如何在一个服务层去调用不同服务层里面的创建任务方法?现在能想到就是依赖注入,但是要将几十个接口都注入在服务层感觉不是很好。

img

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-22 10:05
    关注

    引自免费微信小程序:皆我百晓生

    在C#和ASP.NET中,实现一个服务层调用另一个服务层中的方法,通常可以借助于依赖注入(Dependency Injection, DI)和接口隔离原则(Interface Segregation Principle, ISP)。这样做的好处是降低了模块之间的耦合度,并且使得代码更容易测试。

    首先,你需要定义一个通用的任务生成接口,所有服务层里的任务生成方法都需要实现这个接口。下面是一个简单的例子:

    public interface ITaskGenerator
    {
        void GenerateTask();
    }
    

    然后,在各个服务层中,为生成任务的方法创建类并实现这个接口:

    public class Service1TaskGenerator : ITaskGenerator
    {
        public void GenerateTask()
        {
            // 在这里实现Service1的服务逻辑
        }
    }
    
    public class Service2TaskGenerator : ITaskGenerator
    {
        public void GenerateTask()
        {
            // 在这里实现Service2的服务逻辑
        }
    }
    

    接下来,你需要配置依赖注入容器,比如Autofac、Microsoft.Extensions.DependencyInjection等。这里以Microsoft.Extensions.DependencyInjection为例,首先在Startup.cs文件中注册服务:

    services.AddTransient<ITaskGenerator, Service1TaskGenerator>();
    services.AddTransient<ITaskGenerator, Service2TaskGenerator>();
    

    现在,你可以在需要的地方(例如:一个主服务层或者控制器)注入ITaskGenerator接口,从而可以动态地选择调用哪个服务层的任务生成方法。以下是一个控制器的例子:

    using Microsoft.AspNetCore.Mvc;
    using YourNamespace.Services;
    
    [ApiController]
    [Route("[controller]")]
    public class MainController : ControllerBase
    {
        private readonly List<ITaskGenerator> _taskGenerators;
    
        public MainController(List<ITaskGenerator> taskGenerators)
        {
            _taskGenerators = taskGenerators;
        }
    
        [HttpPost("ApproveAndGenerateTasks")]
        public async Task<IActionResult> ApproveAndGenerateTasks([FromBody] ApprovalRequest request)
        {
            // 审批逻辑...
            
            foreach (var taskGenerator in _taskGenerators)
            {
                taskGenerator.GenerateTask();
            }
    
            return Ok("Tasks generated successfully.");
        }
    }
    

    在这个例子中,MainController会接收到审批请求,然后遍历所有的ITaskGenerator实例并调用它们的GenerateTask()方法。

    注意,这种方法的一个潜在问题是可能会导致内存中存在多个相同服务的实例。如果你只需要一个实例,可以考虑使用AddSingleton而不是AddTransient。另外,根据实际项目结构,可能需要调整依赖注入和代码组织方式。

    这是一个相对灵活的架构,可以根据需求增加新的服务层和任务生成器,而不需要对主服务层做太多修改。同时,也方便单元测试,因为可以通过构造函数注入不同的实现来进行针对性测试。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 5月22日
  • 创建了问题 5月22日

悬赏问题

  • ¥30 arduino vector defined in discarded section `.text' of wiring.c.o (symbol from plugin)
  • ¥20 关于#c++#的问题:(2)运算二叉树·表达式一般由一个运算符和两个操作数组成:(相关搜索:二叉树遍历)
  • ¥20 如何训练大模型在复杂因素组成的系统中求得最优解
  • ¥15 关于#r语言#的问题:在进行倾向性评分匹配时,使用“match it"包提示”错误于eval(family$initialize): y值必需满足0 <= y <= 1“请问在进行PSM时
  • ¥45 求17位带符号原码乘法器verilog代码
  • ¥20 PySide6扩展QLable实现Word一样的图片裁剪框
  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)