.Net6 DI依赖注入

1,171 阅读2分钟

创建服务

新增一个Services文件夹,创建个StudentServices类专门存放学生

 public class StudentServices
    {
        //和控制器时写的一样,把上下文和automapper放进来
        private readonly StudentContext _context;
        private readonly IMapper _mapper;
        public StudentServices(StudentContext context, IMapper mapper)
        {
            _context = context;
            _mapper = mapper;
        } 
     //简单的创建个Get方法
        public  async Task<IEnumerable<StudentDTO>> Get()
        {
            var student = await _context.Student.Include(x=>x.Classes).ToListAsync();
            return _mapper.Map<IEnumerable<StudentDTO>>(student);
        }
    }

在控制器添加服务

QQ截图20220228145625.png 简单的创建个Get方法

[HttpGet]
        public async Task<IActionResult> Get()
        {
            var result = await _studentservices.Get();
            if(result.Count()==0||result == null)
            {
                return NotFound("没有数据");
            }
            return  Ok(result) ;
        }

依赖注入

在Program类依赖注入服务

QQ截图20220228145815.png

Update

//添加个返回状态类
public class ResultData
    {
        public int Code { get; set; }
        public string Message { get; set; }
    }
public async Task<ResultData> Update(StudentDTO studentDTO)
        {
            var student = _mapper.Map<Student>(studentDTO);
            //查看是否存在用户,有就更新没有就新增
            if (await _context.Student.AnyAsync(x => x.Id.Equals(student.Id)))
            {
                student.Classes = await _context.Set<Classes>().Where(x => x.Id == Guid.Parse(studentDTO.ClassId)).FirstAsync();
                student.AdmissionTime = await _context.Set<Student>().Where(x => x.Id == studentDTO.Id).Select(x => x.AdmissionTime).FirstOrDefaultAsync();
                _context.Student.Update(student);
                await _context.SaveChangesAsync();
                return new ResultData() { Code=200,Message="数据更新成功"};
            }
            else
            {
                //没有就新增
                student.Id = Guid.NewGuid();
                student.Classes = await _context.Set<Classes>().Where(x => x.Id == Guid.Parse(studentDTO.ClassId)).FirstAsync();
                student.AdmissionTime = DateTime.Now;
                await _context.Student.AddAsync(student);
                await _context.SaveChangesAsync();
                return new ResultData() { Code = 200, Message = "数据新增成功" };
            }
        }
[HttpPost]
public async Task<ResultData> Update(StudentDTO stu)
        {
            return await _studentservices.Update(stu);
        }

这样做可以提高代码的可复用性,写一个接口然后再service这里写一个通用的crud等功能的实现,最后各个业务再根据使用的数据实体对数据进行crud,在controller里写各自所需要增加的业务逻辑这样维护性就更高了,当然这里时只写了Student,写死的没有做泛型的写法

如何使用IOC

继上一个说了接口,所以就开始使用了IOC

这次在Services文件夹里创建一个IServices接口,将需要的方法接上去,简单的写两个,先做接口再做实现

public interface IStudentServices
    {
        public Task<ResultData> Update(StudentDTO studentDTO);
        public Task<IEnumerable<StudentDTO>> Get();
​
    }

Snipaste_2022-02-28_17-33-04.png service继承接口,在program对接口进行依赖注入

builder.Services.AddScoped<IStudentServices, StudentServices>();

控制器也进行更改

QQ截图20220228173515.png

依赖注入类

如果业务一多起来,一直添加进Program的话就会很臃肿,不好维护,所以创建一个依赖注入类来存放

新建个InjectionHelp.cs,方法和类都是静态的

public static class InjectionHelp
    {
        public static void Injection(this IServiceCollection services)
        {
            #region 学生
            services.AddScoped<IStudentServices, StudentServices>();
            #endregion
        }
    }

在Program.cs里写入,就可以了55662.png哇哦又学会了,不过现在还用不了,以后做了泛型接口再使用,先保留了解一下,然后再把具体实现写在Repository,Service再调用一下

builder.Services.Injection();

Repository

之前一直做的都是Student,这次多分了个Repository层出来,作为具体的实现,Service作为mapper处理,BaseController做通用控制器,Controller继承上一个,然后根据业务实际对接口进行更细的业务实现,先欠着,写完身分验证先

不是所有的项目都要分的越细越好,要根据实际情况使用合适的设计模式进行分层