一、为什么使用仓储模式
个人觉得仓储模式就是升级版的三层架构,里面多了接口之间的调用,就好像仓库管理员,只是负责把仓库里面的东西交给客户,也无需知道客户要做什么,反之客户也无需知道东西在哪里,怎么存放的,需要的时候就跟管理员索要就可以了,这样就是低耦合,就算管理员换人了,客户的流程也无需做出改变,反之亦然。
实际做一遍就一目了然了。
第一步:先把类库创建好
Common类库,公共类库,放一些公共的类和方法,比如,Helper类 字符串转换,编码格式这些。
IRepositry、Repository仓储层,负责处理数据 就是ADO。net那套东西。
IService、Service 业务服务层,三层架构的BLL。
Model 存放实体类
仓储层,创建ITestRepository和TestRepository,这里我们先不连接数据库,下面讲到ORM的时候在连库。
然后在服务层,创建ITestService和TestService类
代码如下,最好不要复制粘贴,自己一个一个创建,这样能更好的了解,哪个类库是做什么的,要怎么做
usingSystem;namespaceWebApi.Core.IRepository
{public interfaceITestRepository
{///
///求和,这里就是定义一下具体实现在 TestRepository///
///
///
///
int Sum(int i, intj);
}
}usingSystem;usingWebApi.Core.IRepository;namespaceWebApi.Core.Repository
{///
///仓储具体实现类,继承仓储接口类///
public classTestRepository:ITestRepository
{///
///求和,仓储实现,这个过程就是访问数据库得到数据,并且返回///
///
///
///
public int Sum(int i, intj)
{return i +j;
}
}
}usingSystem;namespaceWebApi.Core.IService
{///
///业务服务接口层///
public interfaceITestService
{///
///求和声明///
///
///
///
int SumService(int i, intj);
}
}usingSystem;usingWebApi.Core.IRepository;usingWebApi.Core.IService;usingWebApi.Core.Repository;namespaceWebApi.Core.Service
{public classTestService:ITestService
{//这里如果要用到仓储,需要先创建对象,就好像要知道管理员是谁,这个先这么写,后期改成AutoFac的
ITestRepository test = newTestRepository();///
///求和,调用仓储的求和方法,把参数传递给仓储///
///
///
///
public int SumService(int i, intj)
{returntest.Sum(i,j);
}
}
}
好了一个简单的仓储模式算是搭建完成了,接下来我们测试一下,创建一个Controller名字随便取,在里面添加如下代码
///
///测试仓储模式,求和表示层///
///
///
///
[HttpPost]public int SumService(int i, intj)
{//引用service层
ITestService testService = newTestService();returntestService.SumService(i,j);
}
F5启动一下,我们测试一下,从测试结果看,是没有任何问题的
接下来,我们在仓储模式下增加IOC,上面写的时候会发现一些new 实体的 代码,这样的耦合性就很强了,所以需要使用IOC模式来处理这种耦合,这里我们用.net架构比较常用的Autofac
Nuget包引入两个 Autofac.Extras.DynamicProxy、Autofac.Extensions.DependencyInjection
新建一个类来存放Autofac注册Module,如下代码
usingAutofac;usingAutofac.Extras.DynamicProxy;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Reflection;usingSystem.Threading.Tasks;namespaceWebApi.Core.Api.SetUpService
{///
///Autofac注册服务类///
public classAutofacModuleRegister:Autofac.Module
{///
///重写Load函数///
///
protected override voidLoad(ContainerBuilder builder)
{//注册Service
var assemblysServices = Assembly.Load("Webapi.Core.Service");
builder.RegisterAssemblyTypes(assemblysServices)
.InstancePerDependency()//默认模式,每次调用,都会重新实例化对象;每次请求都创建一个新的对象
.AsImplementedInterfaces()//是以接口方式进行注入,注入这些类的所有的公共接口作为服务(除了释放资源)
.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方法下面,新建如下代码
///
///注册Autofac容器///
///
public voidConfigureContainer(ContainerBuilder builder)
{
builder.RegisterModule(newAutofacModuleRegister());
}
在program.cs 文件中 初始化一下实例代码如下
public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory()) //这里是替换容器的,微软默认的注入方式是DI,替换成autofac实例
.ConfigureWebHostDefaults(webBuilder =>{
<