ASP.NETCOREAPI第⼀篇项⽬整体搭建仓储+服务+抽象接⼝
模式
原⽂作者:
零、完成图中的粉⾊部分
image.png
先简单解释下各层之间的调⽤关系:
除了项⽬对外暴露的是 Api 展⽰层,和核⼼的实体 Model 层外,
仓储模块(作为⼀个数据库管理员,直接操作数据库,实体模型):
BaseRepository(基类仓储) 继承实现了 接⼝IBaseRepository,这⾥放公共的⽅法,
AdvertisementRepostitory 继承 BaseRepository<Advertisement>, IAdvertisementRepository
Service模块(处理业务逻辑,可以直接使⽤ViewModel视图模型):
BaseService 调⽤ BaseRepository,同时继承 IBaseService
AdvertisementServices 继承 BaseServices<Advertisement>, IAdvertisementServices
⼀、创建实体Model数据层
image.png
其中,Models⽂件夹中,存放的是整个项⽬的数据库表实体类,这⾥是⼿动创建的,当然也可以⾃动创建,在以后的⽂章中我会提到,⽤到的是SqlSugar的T4创建,这⾥先埋⼀个伏笔。
提⽰:这个伏笔已经完成,地址《》
然后,VeiwModels⽂件夹,是存放的DTO实体类,在开发中,⼀般接⼝需要接收数据,返回数据,我之前都是这么红果果的使⽤的,后来发现弊端很⼤,不仅把重要信息暴露出去(⽐如⼿机号等),还对数据造成冗余(⽐如我需要接收⽤户的⽣⽇,还需要具体的年、⽉、⽇这就是三个字段,当然您也可以⼿动拆开,这只是⼀个栗⼦,所以不能直接⽤数据库实体类接收),就⽤到了DTO类的转换,但是频繁的转换⼜会⿇烦,别慌,以后的⽂章中,我们会引⽤AutoMapper来⾃动转换,这⾥再买⼀个伏笔。
提⽰:这个伏笔已经完成,地址《》
最后的是MessageModel和TableModel,⼤家也基本⼀看就能明⽩,因为在前端接⼝中,需要固定的格式,以及操作,不能把数据直接发出去,会报错,在以后的Vue开发中,会提到这个,这⾥⼜买了⼀个伏笔。 如下:
/// <summary>
/// 通⽤返回信息类
/// </summary>
public class MessageModel<T>
{
/// <summary>
/// 操作是否成功
/// </summary>
public bool Success { get; set; }
/// <summary>
/// 返回信息
/// </summary>
public string Msg { get; set; }
/// <summary>
/// 返回数据集合
/
// </summary>
public List<T> Data { get; set; }
}
整个项⽬运⾏,没错,继续创建下⼀层。
⼆、设计仓储接⼝与其实现类
创建Blog.Core.IRepository和 Blog.Core.Repository 仓储层:
这⾥简单说下仓储层:repository就是⼀个管理数据持久层的,它负责数据的CRUD(Create, Read, Update, Delete) service layer是业务逻辑层,它常常需要访问repository层。有⽹友这么说:Repository(仓储):协调领域和数据映射层,利⽤类似与集合的接⼝来访问领域对象。Repository 是⼀个独⽴的层,介于领域层与数据映射层(数据访问层)之间。它的存在让领域层感觉不到数据访问层的存在,它提供⼀个类似集合的接⼝提供给领域层进⾏领域对象的访问。Repository 是仓库管理员,领域层需要什么东西只需告诉仓库管理员,由仓库管理员把东西拿给它,并不需要知道东西实际放在哪。
image.png
我们定义了IRepository层,提供了所有的操作接⼝,今天搭建框架,我简单地写⼀个实例,明天我们将把所有的⽅法嵌套进去。
在 IAdvertisementRepository.cs 中,添加⼀个求和接⼝
namespace Blog.Core.IRespository
{
public interface IAdvertisementRepository
{
int Sum(int i, int j);
}
}
运⾏项⽬,⼀切正常,继续往下。
三、设计服务接⼝与其实现类
创建 Blog.Core.IServices 和 Blog.Core.Services 业务逻辑层,就是和我们平时使⽤的三层架构中的BLL层很相似:
image.png
Service层只负责将Repository仓储层的数据进⾏调⽤,⾄于如何是与数据库交互的,它不去管,这样就可以达到⼀定程度上的解耦,假如以后数据库要换,⽐如MySql,那Service层就完全不需要修改即可,⾄于真正意义的解耦,还是得靠依赖注⼊,这下⼀节我们会讲到。
这⾥在 IAdvertisementServices 中添加接⼝
namespace Blog.Core.IServices
{
public interface IAdvertisementServices
{
int Sum(int i,int j);
}
}
然后再在 AdvertisementServices 中去实现该接⼝
using Blog.Core.IServices;
using Blog.Core.IRespository;
using Blog.Core.Respository;
namespace Blog.Core.Services
{
public class AdvertisementServices : IAdvertisementServices
{
IAdvertisementRepository dal = new AdvertisementRepository(); public int Sum(int i, int j)
{
return dal.Sum(i, j);
}
}
}
注意!这⾥是引⼊了三个命名空间:
using Blog.Core.IServices;
using Blog.Core.IRespository;
using Blog.Core.Respository;
四、创建 Controller 接⼝调⽤
image.pngmvc的三层架构
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论