Repository、IUnitOfWork 和 IDbContext
2024-09-25 01:09:19
1)领域层不应该直接依赖于仓储实现:如果领域层依赖于仓储实现,一是技术绑定太紧密,二是仓储要对领域对象作操作,会造成循环依赖。
2)将接口定义在领域层,减少技术架构依赖,应用层或领域层要使用某个仓储实现时,通过依赖注入的方式将仓储实现注射到应用层或领域层,具体IOC在使用时对应用层与领域层的建议见前面的文章。
定义IRepositoryContext接口的主要目的是:因为我们采用的持久化机制是EF,EF是通过DBContext来管理数据操作的事务,一般是针对单实体的。通常我们的业务需要持久化整个聚合的多个实体或通过领域服务或应用服务持久化多个聚合,多个实体或聚合在业务上需要保持一致性,为了达到这个目的,我们引入了工作单元模式与定义了仓储上下文,通过仓储上下文来管理操作的多个实体或多个聚合中的实体,然后通过工作单元模式统一提交来保证事务,从而保证业务的一致性。
IDbContext -> IUnitOfWork(only commit)/IRepository -> UnitOfWork/Repository -> Application Service 方案
using DDD.Sample.Application.Interfaces;
using DDD.Sample.Domain;
using DDD.Sample.Domain.IRepository;
using DDD.Sample.Infrastructure;
using DDD.Sample.Infrastructure.Interfaces;
using DDD.Sample.Repository;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
using EntityFramework.Extensions; namespace DDD.Sample.Application
{
public class StudentService : IStudentService
{
private IUnitOfWork _unitOfWork;
private IStudentRepository _studentRepository;
private ITeacherRepository _teacherRepository; public StudentService(IUnitOfWork unitOfWork,
IStudentRepository studentRepository,
ITeacherRepository teacherRepository)
{
_unitOfWork = unitOfWork;
_studentRepository = studentRepository;
_teacherRepository = teacherRepository;
} public async Task<Student> Get(int id)
{
return await _studentRepository.Get(id).FirstOrDefaultAsync();
} public async Task<bool> Add(string name)
{
var student = new Student { Name = name };
var teacher = await _teacherRepository.Get().FirstOrDefaultAsync();
teacher.StudentCount++; _unitOfWork.RegisterNew(student);
_unitOfWork.RegisterDirty(teacher);
return await _unitOfWork.CommitAsync();
} public async Task<bool> UpdateName(int id, string name)
{
return await _studentRepository.Get(id)
.UpdateAsync(x => new Student { Name = name }) > ;
}
}
}
最新文章
- 项目积累html标签
- 文件夹锁定(Source)
- close-vs-shutdown-socke
- merge sort and quick sort 自己去理解吧
- PHP创建缩略图造成图片质量低下的完美解决方法
- linux下统计当前目录下文件个数
- GridControl 无数据时显示信息
- web安全记录
- Hibernate 继承表结构
- 多线程环境下非安全Dictionary引起的&ldquo;已添加了具有相同键的项&rdquo;问题
- python list 中 remove 的骚操作/易错点
- struts2自定义转换器
- kill -9 ,kill -12,kill -15
- EtherCAT 要点
- Java 基础 面向对象和抽象类
- 20181013xlVba计算优秀率及合格率
- Java中涉及到金额业务的处理
- ubuntu下安装Pycharm
- MATLAB GUI图片添加背景
- 关于app的cpu占用率想到的几个问题
热门文章
- luogu P1359会议
- [BZOJ 2395] Time is money
- [Contest20180318]求和
- 【AC自动机】【矩阵乘法】【等比数列】hdu2243 考研路茫茫——单词情结
- 【树状数组】bzoj2743 [HEOI2012]采花
- 【记忆化搜索】bzoj1055 [HAOI2008]玩具取名
- 你真的懂ThreadPoolExecutor线程池技术吗?看了源码你会有全新的认识
- JNI概述
- S3C2440的存储器映射(27根地址线如何寻找1G的地址)
- Shiro+SpringMVC 实现更安全的登录(加密匹配&;登录失败超次数锁定帐号)