.net core 实例教程(三)仓储及领域服务功能实现(既实现用户表的增删改查接口)

本文源码下载地址:http://www.80cxy.com/Blog/ResourceView?arId=202403191532545995NAAqJh

系列教程地址:http://www.80cxy.com/Blog/ArticleView?arId=202403191517574161ay3s5V

本文实现用户表的增删改查操作,主要分为仓储实现、领域服务实现以及注册服务功能。

仓储封装了基础设施来提供查询和持久化聚合操作。它们集中提供常见的数据访问功能,从而提供更好的可维护性,并将用于访问数据库的基础结构或技术与领域层分离。创建数据访问层和应用程序的业务逻辑层之间的抽象层。

领域服务主要实现业务逻辑代码。

一、仓储实现

在SignUp.Domain项目创建ISystemDomainRepostory仓储接口,并在SignUp.Infrastructure项目中实现ISystemDomainRepostory接口。具体代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

using Microsoft.EntityFrameworkCore;

using SignUp.Common.DataFilter;

using SignUp.Common.Enum;

using SignUp.Domain.Entities;

using SignUp.Domain.Repository;

using System.Linq.Expressions;

namespace SignUp.Infrastructure.Repository

{

    public class SystemDomainRepostory : ISystemDomainRepostory

    {

        public readonly SignUpDbContext _dbContext;

        public SystemDomainRepostory(SignUpDbContext dbContext)

        {

            this._dbContext = dbContext;

        }

        #region 用户管理

        public async Task<SysUser?> FindOneUserById(string id)

        {

            return await _dbContext.SysUser.FindAsync(id);

        }

        public async Task<(SysUser[], int total)> GetUserList(int pageIndex, int pageSize, string wheres, string sort, string order)

        {

            //where查询条件

            List<DataFilter> searchParametersList = FormatParameters.GetSearchParameters(wheres);

            //order排序条件

            Dictionary<string, QueryOrderBy> orderBy = FormatParameters.GetOrderParameters(sort, order);

            //构造查询条件

            Expression<Func<SysUser, bool>> expression = DataFilterConvertor<SysUser>.ToExpression(searchParametersList);

            var listAll = _dbContext.SysUser.Where(expression);

            int total = listAll.Count();

            var list = await listAll.OrderConditions(orderBy).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToArrayAsync();

            return (list, total);

        }

        public async Task<SysUser> AddUser(string userName, string password, string realName, string userType)

        {

            SysUser model = SysUser.Add(userName, password, realName, userType);

            await _dbContext.SysUser.AddAsync(model);

            await _dbContext.SaveChangesAsync();

            return model;

        }

        public async Task<SysUser> EditUser(string id, string userName, string realName, string userType)

        {

            var model = await FindOneUserById(id);

            model?.Edit(userName, realName, userType);

            await _dbContext.SaveChangesAsync();

            return model;

        }

        public async Task DeleteUser(string id)

        {

            var model = await _dbContext.SysUser.FindAsync(Guid.Parse(id));

            if (model != null)

            {

                _dbContext.SysUser.Remove(model);

            }

        }

        public void DeleteUserRange(string[] ids)

        {

            var list = _dbContext.SysUser.Where(x => ids.Contains(x.Id.ToString())).ToArray();

            if (list.Length != 0)

            {

                _dbContext.SysUser.RemoveRange(list);

            }

        }

        #endregion

    }

}

二、领域服务实现

在SignUp.Domain项目创建领域服务类SystemDomainService,具体代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

using SignUp.Common.Commons;

using SignUp.Common.Enum;

using SignUp.Domain.Entities;

using SignUp.Domain.Repository;

namespace SignUp.Domain.Service

{

    public class SystemDomainService : ISystemDomainService

    {

        private ISystemDomainRepostory _systemDomainRepostory;

        public SystemDomainService(ISystemDomainRepostory systemDomainRepostory)

        {

            _systemDomainRepostory = systemDomainRepostory;

        }

        public async Task<ResponseContent> GetUserList(int pageIndex, int pageSize, string wheres, string sort, string order)

        {

            ResponseContent response = new ResponseContent();

            (var list, int total) = await _systemDomainRepostory.GetUserList(pageIndex, pageSize, wheres, sort, order);

            return response.Ok(new { total = total, rows = list });

        }

        public async Task<ResponseContent> AddUser(string userName, string password, string realName, string userType)

        {

            ResponseContent response = new ResponseContent();

            await _systemDomainRepostory.AddUser(userName, password, realName, userType);

            return response.Ok();

        }

        public async Task<ResponseContent> EditUser(string id, string userName, string realName, string userType)

        {

            ResponseContent response = new ResponseContent();

            var model = await _systemDomainRepostory.EditUser(id, userName, realName, userType);

            return response.Ok();

        }

        public async Task<ResponseContent> DeleteUser(string id)

        {

            ResponseContent response = new ResponseContent();

            await _systemDomainRepostory.DeleteUser(id);

            return response.Ok();

        }

        public ResponseContent DeleteUserRange(string[] ids)

        {

            ResponseContent response = new ResponseContent();

            _systemDomainRepostory.DeleteUserRange(ids);

            return response.Ok();

        }

    }

}

三、注册仓储、领域服务

为避免所有内容到入口项目中注册,每个项目中自己实现IModuleInitializer接口的类,并在其中注册自己需要的服务。然后通过ModuleInitializerExtensions注册到IServiceCollection中去。

相关代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

using Microsoft.Extensions.DependencyInjection;

namespace SignUp.Common.Commons

{

    /// <summary>

    /// 所有项目中的实现了IModuleInitializer接口都会被调用,请在Initialize中编写注册本模块需要的服务。

    /// 一个项目中可以放多个实现了IModuleInitializer的类。不过为了集中管理,还是建议一个项目中只放一个实现了IModuleInitializer的类

    /// </summary>

    public interface IModuleInitializer

    {

        public void Initialize(IServiceCollection services);

    }

}

using Microsoft.Extensions.DependencyInjection;

using SignUp.Common.Commons;

using SignUp.Domain.Repository;

using SignUp.Domain.Service;

using SignUp.Infrastructure.Repository;

namespace SignUp.Infrastructure

{

    class ModuleInitializer : IModuleInitializer

    {

        public void Initialize(IServiceCollection services)

        {

            services.AddScoped<ISystemDomainService, SystemDomainService>();

            services.AddScoped<ISystemDomainRepostory, SystemDomainRepostory>();

        }

    }

}

using Microsoft.Extensions.DependencyInjection;

using System.Reflection;

namespace SignUp.Common.Commons

{

    public static class ModuleInitializerExtensions

    {

        /// <summary>

        /// 每个项目中都可以自己写一些实现了IModuleInitializer接口的类,在其中注册自己需要的服务,这样避免所有内容到入口项目中注册

        /// </summary>

        /// <param name="services"></param>

        /// <param name="assemblies"></param>

        public static IServiceCollection RunModuleInitializers(this IServiceCollection services,

         IEnumerable<Assembly> assemblies)

        {

            foreach (var asm in assemblies)

            {

                Type[] types = asm.GetTypes();

                var moduleInitializerTypes = types.Where(t => !t.IsAbstract && typeof(IModuleInitializer).IsAssignableFrom(t));

                foreach (var implType in moduleInitializerTypes)

                {

                    var initializer = (IModuleInitializer?)Activator.CreateInstance(implType);

                    if (initializer == null)

                    {

                        throw new ApplicationException($"Cannot create ${implType}");

                    }

                    initializer.Initialize(services);

                }

            }

            return services;

        }

    }

}

学习交流

附笔者学习 .net core开发时参考相关项目实例源码:asp.net core webapi项目实例源代码锦集下载(72个)

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值