.Netcore搭建仓储模式+SqlsugarORM+AutoFac
⼀、为什么使⽤仓储模式
个⼈觉得仓储模式就是升级版的三层架构,⾥⾯多了接⼝之间的调⽤,就好像仓库管理员,只是负责把仓库⾥⾯的东西交给客户,也⽆需知道客户要做什么,反之客户也⽆需知道东西在哪⾥,怎么存放的,需要的时候就跟管理员索要就可以了,这样就是低耦合,就算管理员换⼈了,客户的流程也⽆需做出改变,反之亦然。
实际做⼀遍就⼀⽬了然了。
第⼀步:先把类库创建好
Common类库,公共类库,放⼀些公共的类和⽅法,⽐如,Helper类字符串转换,编码格式这些。
IRepositry、Repository仓储层,负责处理数据就是ADO。net那套东西。
IService、Service 业务服务层,三层架构的BLL。
Model 存放实体类
仓储层,创建ITestRepository和TestRepository,这⾥我们先不连接数据库,下⾯讲到ORM的时候在连库。
然后在服务层,创建ITestService和TestService类
代码如下,最好不要复制粘贴,⾃⼰⼀个⼀个创建,这样能更好的了解,哪个类库是做什么的,要怎么做
using System;
namespace WebApi.Core.IRepository
{
public interface ITestRepository
{
///<summary>
///求和,这⾥就是定义⼀下具体实现在 TestRepository
///</summary>
///<param name="i"></param>
///<param name="j"></param>
///<returns></returns>
int Sum(int i, int j);
}
using System;
using WebApi.Core.IRepository;
namespace WebApi.Core.Repository
{
///<summary>
///仓储具体实现类,继承仓储接⼝类
///</summary>
public class TestRepository:ITestRepository
{
///<summary>
///求和,仓储实现,这个过程就是访问数据库得到数据,并且返回
///</summary>
///<param name="i"></param>
///<param name="j"></param>
///<returns></returns>
public int Sum(int i, int j)
{
return i + j;
}
}
}
using System;
namespace WebApi.Core.IService
{
///<summary>
///业务服务接⼝层
///</summary>
public interface ITestService
{
///<summary>
/
//求和声明
///</summary>
///<param name="i"></param>
///<param name="j"></param>
///<returns></returns>
int SumService(int i, int j);
}
}
using System;
using WebApi.Core.IRepository;
using WebApi.Core.IService;
using WebApi.Core.Repository;
namespace WebApi.Core.Service
{
public class TestService:ITestService
{
//这⾥如果要⽤到仓储,需要先创建对象,就好像要知道管理员是谁,这个先这么写,后期改成AutoFac的
ITestRepository test = new TestRepository();
///<summary>
///求和,调⽤仓储的求和⽅法,把参数传递给仓储
///</summary>
///<param name="i"></param>
///<param name="j"></param>
///<returns></returns>
public int SumService(int i, int j)
{
return test.Sum(i,j);
}
}
}
好了⼀个简单的仓储模式算是搭建完成了,接下来我们测试⼀下,创建⼀个Controller名字随便取,在⾥⾯添加如下代码///<summary>
///测试仓储模式,求和表⽰层
///</summary>
///<param name="i"></param>
///<param name="j"></param>
///<returns></returns>
[HttpPost]
public int SumService(int i, int j)
//引⽤service层
ITestService testService = new TestService();
return testService.SumService(i,j);
}
F5启动⼀下,我们测试⼀下,从测试结果看,是没有任何问题的
接下来,我们在仓储模式下增加IOC,上⾯写的时候会发现⼀些new 实体的代码,这样的耦合性就很强了,所以需要使⽤IOC模式来处理这种耦合,这⾥我们⽤架构⽐较常⽤的Autofac
Nuget包引⼊两个 Autofac.Extras.DynamicProxy、Autofac.Extensions.DependencyInjection
新建⼀个类来存放Autofac注册Module,如下代码
using Autofac;
using Autofac.Extras.DynamicProxy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace WebApi.Core.Api.SetUpService
{
///<summary>
/// Autofac注册服务类
///</summary>
public class AutofacModuleRegister:Autofac.Module
{
///<summary>
///重写Load函数
///</summary>
///<param name="builder"></param>
protected override void Load(ContainerBuilder builder)
{
//注册Service
var assemblysServices = Assembly.Load("Webapi.Core.Service");
builder.RegisterAssemblyTypes(assemblysServices)
.InstancePerDependency()//默认模式,每次调⽤,都会重新实例化对象;每次请求都创建⼀个新的对象
.EnableInterfaceInterceptors(); //引⽤Autofac.Extras.DynamicProxy;应⽤
//注册Repository
var assemblysRepository = Assembly.Load("Webapi.Core.Repository");
builder.RegisterAssemblyTypes(assemblysRepository)
.InstancePerDependency()//默认模式,每次调⽤,都会重新实例化对象;每次请求都创建⼀个新的对象
.AsImplementedInterfaces()//是以接⼝⽅式进⾏注⼊,注⼊这些类的所有的公共接⼝作为服务(除了释放资源)
.EnableInterfaceInterceptors(); //引⽤Autofac.Extras.DynamicProxy;应⽤
}
}
}
在startup.cs⽂件中,增加⼀个⽅法,⽤来配置Autofac服务容器,在Configure⽅法下⾯,新建如下代码
///<summary>
mvc的三层架构///注册Autofac容器
///</summary>
///<param name="builder"></param>
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterModule(new AutofacModuleRegister());
}
在program.cs ⽂件中初始化⼀下实例代码如下
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory()) //这⾥是替换容器的,微软默认的注⼊⽅式是DI,替换成autofac实例
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
到此我们的注册就算完成了,接下来我们使⽤⼀下,如下图,我们上⾯练习仓储的时候,new 了⼀个仓储的实例,现在我们来改变⼀下
改成如下代码
public class TestService:ITestService
{
/
/这⾥如果要⽤到仓储,需要先创建对象,就好像要知道管理员是谁,这个先这么写,后期改成AutoFac的
//ITestRepository test = new TestRepository();
//改造成Autofac注⼊⽅式,声明⼀个仓储常量
private readonly ITestRepository test;
//构造函数注⼊
public TestService(ITestRepository testRepository)
{
test = testRepository;
}
///<summary>
///求和,调⽤仓储的求和⽅法,把参数传递给仓储
///</summary>
///<param name="i"></param>
///<param name="j"></param>
///<returns></returns>
public int SumService(int i, int j)
return test.Sum(i,j);
}
}
testController这⾥也有⼀个new 也需要变化⼀下
改成如下代码
///<summary>
///测试仓储模式控件
///</summary>
public class TestRepositoryController : BaseController
{
//声明⼀个常量
private readonly ITestService testService;
//构造函数注⼊ service
public TestRepositoryController(ITestService testS)
{
testService = testS;
}
///<summary>
///测试仓储模式,求和表⽰层
///</summary>
/
//<param name="i"></param>
///<param name="j"></param>
///<returns></returns>
[HttpPost]
public int SumService(int i, int j)
{
return testService.SumService(i,j);
}
}
接下来我们F5启动项⽬,测试⼀下,注⼊是否已完成,是否会报错。从结果上看⽊有问题啊,哎真希望报错,踩踩坑啊。这也太顺利了
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论