.net core 实例教程(三)仓储及领域服务功能实现(既实现用户表的增删改查接口)
小白浏览:7222024-03-15 15:06:55本文累计收益:0我也要赚钱

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

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

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

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

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

一、仓储实现

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

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,具体代码如下:

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中去。

相关代码如下:

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个)

评论列表
发表评论
+ 关注