首页 > 数据库 >C# 搭建一个 基于ISqlSugarClient 三层架构框架 涉及数据库仓储 然后中间又有业务逻辑层 案例

C# 搭建一个 基于ISqlSugarClient 三层架构框架 涉及数据库仓储 然后中间又有业务逻辑层 案例

时间:2024-05-04 09:01:39浏览次数:28  
标签:架构 ISqlSugarClient C# void public int user return id

要在C#中搭建基于ISqlSugarClient的三层架构框架,你需要定义数据访问层(DAL)、业务逻辑层(BLL)和表现层(UI)。下面是一个完整的例子,涉及数据库仓储、业务逻辑层,以及依赖注入。这个例子基于ASP.NET Core MVC构建,使用ISqlSugarClient来处理数据访问。这个例子中,我们将使用User作为一个简单的实体来演示三层架构。

数据库实体类

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

数据访问层接口与实现

// 数据访问层接口
public interface IUserRepository
{
    User GetById(int id);
    List<User> GetAll();
    void Add(User user);
    void Update(User user);
    void Delete(int id);
}

// 基础仓储实现
public abstract class BaseRepository<T> where T : class, new()
{
    protected readonly ISqlSugarClient _sqlSugarClient;

    protected BaseRepository(ISqlSugarClient sqlSugarClient)
    {
        _sqlSugarClient = sqlSugarClient;
    }

    public virtual T GetById(int id)
    {
        return _sqlSugarClient.Queryable<T>().InSingle(id);
    }

    public virtual List<T> GetAll()
    {
        return _sqlSugarClient.Queryable<T>().ToList();
    }

    public virtual void Add(T entity)
    {
        _sqlSugarClient.Insertable(entity).ExecuteCommand();
    }

    public virtual void Update(T entity)
    {
        _sqlSugarClient.Updateable(entity).ExecuteCommand();
    }

    public virtual void Delete(int id)
    {
        _sqlSugarClient.Deleteable<T>().In(id).ExecuteCommand();
    }
}

// User数据访问层实现
public class UserRepository : BaseRepository<User>, IUserRepository
{
    public UserRepository(ISqlSugarClient sqlSugarClient) : base(sqlSugarClient)
    {
    }
}

 

业务逻辑层

public class UserService
{
    private readonly IUserRepository _userRepository;

    public UserService(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public User GetUserById(int id)
    {
        return _userRepository.GetById(id);
    }

    public List<User> GetAllUsers()
    {
        return _userRepository.GetAll();
    }

    public void AddUser(User user)
    {
        _userRepository.Add(user);
    }

    public void UpdateUser(User user)
    {
        _userRepository.Update(user);
    }

    public void DeleteUser(int id)
    {
        _userRepository.Delete(id);
    }
}

 

依赖注入配置

public class DependencyInjectionConfig
{
    public static void Configure(IServiceCollection services, string connectionString)
    {
        // 注册ISqlSugarClient实例
        services.AddScoped<ISqlSugarClient>(_ => new SqlSugarClient(new ConnectionConfig()
        {
            ConnectionString = connectionString,
            DbType = DbType.SqlServer,
            InitKeyType = InitKeyType.Attribute,
            IsAutoCloseConnection = true
        }));

        // 注册数据访问层接口和实现类
        services.AddScoped<IUserRepository, UserRepository>();

        // 注册业务逻辑层
        services.AddScoped<UserService>();
    }
}

 

表现层示例

public class UserController : Controller
{
    private readonly UserService _userService;

    public UserController(UserService userService)
    {
        _userService = userService;
    }

    public IActionResult Index()
    {
        var users = _userService.GetAllUsers();
        return View(users);
    }

    public IActionResult Details(int id)
    {
        var user = _userService.GetUserById(id);
        if (user == null)
        {
            return NotFound();
        }
        return View(user);
    }

    public IActionResult Create()
    {
        return View();
    }

    [HttpPost]
    public IActionResult Create(User user)
    {
        if (ModelState.IsValid)
        {
            _userService.AddUser(user);
            return RedirectToAction("Index");
        }
        return View(user);
    }

    public IActionResult Edit(int id)
    {
        var user = _userService.GetUserById(id);
        if (user == null)
        {
            return NotFound();
        }
        return View(user);
    }

    [HttpPost]
    public IActionResult Edit(User user)
    {
        if (ModelState.IsValid)
        {
            _userService.UpdateUser(user);
            return RedirectToAction("Index");
        }
        return View(user);
    }

    public IActionResult Delete(int id)
    {
        var user = _userService.GetUserById(id);
        if (user == null)
        {
            return NotFound();
        }
        return View(user);
    }

    [HttpPost, ActionName("Delete")]
    public IActionResult DeleteConfirmed(int id)
    {
        _userService.DeleteUser(id);
        return RedirectToAction("Index");
    }
}

 

Startup配置

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // 配置依赖注入
        var connectionString = "YourConnectionStringHere";
        DependencyInjectionConfig.Configure(services, connectionString);

        // 注册MVC服务
        services.AddControllersWithViews();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

 

这个完整示例展示了如何在C#中构建三层架构,包括数据访问层、业务逻辑层和表现层。数据访问层使用ISqlSugarClient与数据库进行交互,业务逻辑层包含应用程序的核心业务逻辑,表现层负责与用户交互。通过依赖注入,确保每一层之间的松耦合。

标签:架构,ISqlSugarClient,C#,void,public,int,user,return,id
From: https://www.cnblogs.com/mojiejushi/p/18171969

相关文章

  • 介绍一下opentcs
    OpenTCS是一个开源的自动运载系统(AutomatedGuidedVehicle,AGV)控制系统。它旨在管理和控制自动化运输车辆,例如AGV或自动搬运车(AMR),在工业和商业环境中执行各种任务。下面是一些关键特性和组件:任务调度和优化:OpenTCS能够规划和优化AGV的任务执行顺序,以最大程度地提高效率和资源......
  • SQL注入-基于Pikachu的学习
    zhSQL注入SQL数据库的基本语句SQL教程|菜鸟教程(runoob.com)史上最全SQL基础知识总结(理论+举例)-CSDN博客SQL注入原理SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分......
  • 题解【[ABC147F] Sum Difference】
    题目链接下为口胡题解:入手方向推导:直接考虑题目所给式子显然困难:\[w(S)=\sum_{i\inS}A_i-\sum_{i\notinS}A_i\]因为两个式子虽然相关但是都在变化,不妨转化为:\[w(S)=2\times\sum_{i\inS}A_i-\sum_{i=1}^nA_i\]这样只用求出有多少个不同的\(\sum_{i\inS}A_i\)。由于......
  • CMS垃圾收集器深入解析
    CMS本身是个非常极端的垃圾收集器,他过于注重停顿时间,而不在乎吞吐量。正常情况使用标记清除算法,所以也会有内存碎片的产生,整个CMS垃圾收集的过程,主要是为了缩短停顿时间,所以在有些环节会与业务线程并发执行。1.初始标记,根据GCRoot的引用链,只标记第一个对象,此时是多个标记线程并......
  • C语言代码题
    C语言代码--练习题试写一个函数,计算字符串s中最大连续相同的字符个数。例如,若s为"aaabbbb",则返回值为4;若s为"abcde",则返回值为1。#include<stdio.h>/******************************************************************************functionname:max_sam......
  • excel - SUMIF的使用
    SUMIF(range,criteria,[sum_range])range是你要根据条件进行检查的单元格区域。criteria是根据其检查range的条件。这个条件可以是数字、表达式、或文本字符串。[sum_range]是可选的参数,当要求和的数字位于与range不同的区域时使用。如果省略sum_range,Excel会默认......
  • SpringMVC(3)-request域和session域的作用和区别
    最近看到项目中用到request域和session域,脑子里一直没有一个明确的区分,结合GPT整理了一份总结。为了理解request和session的作用和区别,可以想象我们正在参加一个大型的科技会议。会议中,每位与会者(用户)都会与会议工作人员(服务器)进行交流。在这个比喻中,request域和session域是用于......
  • 【C语言】---- 文件输入输出与文件管理函数
    1文件输入输出函数1.1打开和关闭文件fopen函数fopen是C标准库中用于打开文件的函数之一。它的原型定义在<stdio.h>头文件中,具体格式如下:FILE*fopen(constchar*filename,constchar*mode);这个函数接受两个参数:filename:一个以字符串形式表示的文件名,用于指定要......
  • Godot.NET C#IOC重构(11):攻击与死亡
    目录前言带上伤害HitboxHurtbox实现效果渐变淡出添加受攻击效果Hurtbox完善Enemy状态机结果剩下的都是逻辑完善的部分了,后面的我就跳过了。前言这次来深刻了解一下Godot中的伤害计算带上伤害我们将之前的Hitbox和HurtBox进行了一下简单的修改HitboxusingGodot;usingSyste......
  • Linux(centos7)实现git push到gitee
    1.找到需要提交的文夹目录cd目的目录2.初始化git仓库gitinit看见最下面的InitializedemptyGitrepositoryin就是初始化成功了3.配置提交人信息gitconfig--globaluser.name“你想填的名字”gitconfig--globaluser.email"你的邮箱"最后查看一下是否正确gi......