C# 搭建一个 基于ISqlSugarClient 三层架构框架 涉及数据库仓储 然后中间又有业务逻辑层 案例
要在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与数据库进行交互,业务逻辑层包含应用程序的核心业务逻辑,表现层负责与用户交互。通过依赖注入,确保每一层之间的松耦合。
C# 搭建一个 基于ISqlSugarClient 三层架构框架 涉及数据库仓储 然后中间又有业务逻辑层 案例的更多相关文章
- Dubbo入门介绍---搭建一个最简单的Demo框架
Dubbo入门---搭建一个最简单的Demo框架 置顶 2017年04月17日 19:10:44 是Guava不是瓜娃 阅读数:320947 标签: dubbozookeeper 更多 个人分类: D ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- 一个小时搭建一个全栈 Web 应用框架
把想法变为现实的能力是空想家与实干家的区别.不管你是在一家跨国公司工作,还是正在为自己的创业公司而努力,那些有能力将创意转化为真正产品的人,都具有宝贵的技能并拥有明显的实力.如果你能在不到一个小时的时 ...
- Uber如何搭建一个基于Kafka的跨数据中心复制平台 原创: 徐宏亮 AI前线 今天
Uber如何搭建一个基于Kafka的跨数据中心复制平台 原创: 徐宏亮 AI前线 今天
- 快速搭建一个基于react的项目
最近在学习react,快速搭建一个基于react的项目 1.创建一个放项目文件夹,用编辑器打开 2.打开集成终端输入命令: npm install -g create-react-app 3. cre ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(4)-业务逻辑层的封装
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(4)-业务逻辑层的封装 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2) ...
- MVC5 网站开发之四 业务逻辑层的架构和基本功能
业务逻辑层在Ninesky.Core中实现,主要功能封装一些方法通过调用数据存储层,向界面层提供服务. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 ...
- 亲手搭建一个基于Asp.Net WebApi的项目基础框架1
目标:教大家搭建一个简易的前后端分离的项目框架. 目录: 1:关于项目架构的概念 2:前后端分离的开发模式 3:搭建框架的各个部分 这段时间比较闲,所以想把之前项目里用到的一些技术写到博客里来,分享给 ...
- Dubbo入门—搭建一个最简单的Demo框架
一.Dubbo背景和简介 1.电商系统的演进 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. a.单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一 ...
- Dubbo入门---搭建一个最简单的Demo框架(转)
Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...
随机推荐
- Qt/C++编写超精美自定义控件(历时9年更新迭代/超202个控件/祖传原创)
一.前言 无论是哪一门开发框架,如果涉及到UI这块,肯定需要用到自定义控件,越复杂功能越多的项目,自定义控件的数量就越多,最开始的时候可能每个自定义控件都针对特定的应用场景,甚至里面带了特定的场景的一 ...
- Qt编写安防视频监控系统64-子模块8飞行轨迹
一.前言 飞行轨迹子模块是专为无人机打造的模块,也可以作为机器人移动模块,通过传入一个经纬度值,实时更新设备的位置和绘制轨迹,模块已经内置了接口进行处理,支持不同设备不同的轨迹颜色(这个功能好). 这 ...
- UDP与TCP+JAVA相关理论
相关知识 目录 相关知识 UDP UDP认识 UDP的特点(与TCP相比) UDP网络Socket编程(Java实现) 1.创建客户端 2.客户端图形界面 TCP Socket编程通信 JAVA 基础 ...
- Error: Assertion failed (nimages > 0) in cv::calibrateCameraRO, file D:\opencv4\opencv\opencv-4.1.0\modules\calib3d\src\calibration.cpp, line 3691
报错信息: Error: Assertion failed (nimages > 0) in cv::calibrateCameraRO, file D:\opencv4\opencv\open ...
- [转]vue 项目npm install 报错 npm ERR! enoent undefined ls-remote -h -t ssh://git@github.com/sohee-lee7/Sq
npm install出错的解决办法 很多小伙伴可能跟我一样是个小白,还不知道怎么启动vue,然后就照着README一阵乱搞,然后npm install的时候就报了以下的错误,网上的解决办法也看不懂, ...
- IM开发干货分享:我是如何解决大量离线消息导致客户端卡顿的
1.引言 好久没写技术文章了,今天这篇不是原理性文章,而是为大家分享一下由笔者主导开发实施的IM即时通讯聊天系统,针对大量离线消息(包括消息漫游)导致的用户体验问题的升级改造全过程. 文章中,我将从如 ...
- Web网页端IM产品RainbowChat-Web的v5.0版已发布
一.关于RainbowChat-Web RainbowChat-Web是一套Web网页端IM系统,是RainbowChat的姊妹系统(RainbowChat是一套基于开源IM聊天框架 MobileIM ...
- vue基础5
1.组件通信 a.父传子: // 总结:1.父传子:传递的是基础数据类型 给父组件中的子组件绑定属性,此时属性的值在父组件中已经定义,子组件需要通过porps接收,要用数组接收 在子组件中直接渲染接收 ...
- Vue数据更新不渲染页面的问题
一. 问题现象 在通过数组下标的方式修改集合元素,元素的值确实是更新了,但是页面不能重新渲染. 二. 原因分析 Vue官方文档传送门 三. 解决方案 // 针对数组使用 this.$set(arr,i ...
- 「V 曲闲谈」《一半的梦》——“模糊”&「NOIP 2022」未游之记
好久没写闲谈了欸.现在雨兔正坐在家里的台式机前,开着腾讯会议监控自习,但是她悄悄打开记事本,bilibili 单曲循环<一半的梦>(系统 Vol=2,兔耳朵真好使). 感谢 Rai ...