DDD领域驱动之干货(二)
1、前言:本着第一节写的有些糊涂,主要是自己喜欢实干,不太喜欢用文字表述,就这样吧。下面切入正题。
博客园里面有很多的大佬,我这里就不一一解释概览,有兴趣的朋友可以去看大佬们写的概览。好了不多说了。我们先来看看仓储的实现。
2、上一节中我们已经实现了model,现在我们就来实现仓储。
首先声明一个借口,这里我定义为IRepository,而这个接口我要用做泛型,所以接口如下:

3、现在给这个接口写上接口的方法:
using Mio.Domain.BaseModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks; namespace Mio.Domain.Repositories
{
/// <summary>
/// 在DDD中仓储只能操作聚合根
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public interface IRepository<TEntity> where TEntity : AggregateRoot
{
IEnumerable<TEntity> LoadListAll(Expression<Func<TEntity, bool>> predicate);
IQueryable<TEntity> LoadAll(Expression<Func<TEntity, bool>> predicate); IEnumerable<TEntity> LoadListForSql(string sql);
IQueryable<TEntity> LoadForSql(string sql); /// <summary>
/// 根据聚合根的ID值,从仓储中读取聚合根。
/// </summary>
/// <param name="key">聚合根的ID值。</param>
/// <returns>聚合根实例。</returns>
TEntity GetKey(Guid key);
/// <summary>
/// 将指定的聚合根添加到仓储中。
/// </summary>
/// <param name="aggregateRoot">需要添加到仓储的聚合根实例。</param>
void Add(TEntity aggregateRoot);
/// <summary>
/// 将指定的聚合根从仓储中移除。
/// </summary>
/// <param name="aggregateRoot">需要从仓储中移除的聚合根。</param>
void Remove(TEntity aggregateRoot);
/// <summary>
/// 更新指定的聚合根。
/// </summary>
/// <param name="aggregateRoot">需要更新的聚合根。</param>
void Update(TEntity aggregateRoot);
}
}
接口的方法写完了。
上节说了每一个领域模型都是特有的,所以在这里每一个领域模型都有一个固定的仓储实现。

好了,现在接口方法我们写完了,现在去写实现类。
我这里只做了一个测试所以简单的贴下代码。
using Mio.Domain.Model;
using Mio.Domain.Repositories;
using Mio.Repository.EFRepository;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Mio.Repository.ModelRepository
{
/// <summary>
/// 用户角色
/// </summary>
public class UserRoleRepositoryImpl : RepositoryImpl<UserRole>, IUserRoleRepository
{
public Role GetRoleForUser(User user)
{
var context = lazy.Context as MioContext;
if (context != null)
{
string sql = "SELECT * FROM Role as a INNER JOIN UserRole as b ON a.Id = b.RoleId INNER JOIN [User] as c ON c.Id = b.Id WHERE c.Id = '"+user.Id+"'";
return context.Set<Role>().SqlQuery(sql).FirstOrDefault(); //var query = from role in context.Role
// from userRole in context.Userrole
// from usr in context.User
// where role.Id == userRole.RoleId &&
// usr.Id == userRole.Id &&
// usr.Id == user.Id
// select role;
//return query.FirstOrDefault();
}
throw new InvalidOperationException("The provided repository context is invalid.");
}
}
}
差点忘记了我的项目架构图。如下图。

测试如下:

其中引用了automapper。automapper的实现将在下一节介绍,还有其中的工作单元也会在下一节引入。
DDD领域驱动之干货(二)的更多相关文章
- DDD领域驱动之干货(四)补充篇!
距离上一篇DDD系列完结已经过了很长一段时间,项目也搁置了一段时间,想想还是继续完善下去. DDD领域驱动之干货(三)完结篇! 上一篇说到了如何实现uow配合Repository在autofac和au ...
- DDD领域驱动之干货 (一)
说道DDD不得不说传统的架构与DDD的架构区别. 传统的架构不外乎就是三层,而在这三层里面又不断的细分,始终没有达到想要的效果,那么为什么当时还是采用三层. 当然在DDD没有提出的时候三层是大多数人的 ...
- [0] DDD领域驱动设计(二) 之 值对象
DDD中实体对象与值对象的解释比较抽象.主要根据持续性与 ID 识别来区分. ID并非某一对象的直观自然属性,而是在分析建模之 后,赋给模型中的实体类,来达到跟踪,区别,存储目的的一个特值. 结合项目 ...
- DDD领域驱动之干货(三)完结篇!
首先这里发一下结构图,因为是重写的,但是代码都是一样所有如下: 这里我先说一下看了大部分的DDD文章都是采用的WCF做服务,这里呢我用的是webapi做服务,WCF和WEBAPI的区别可以去百度下. ...
- DDD领域驱动之干活(四)补充篇!
距离上一篇DDD系列完结已经过了很长一段时间,项目也搁置了一段时间,想想还是继续完善下去. DDD领域驱动之干货(三)完结篇! 上一篇说到了如何实现uow配合Repository在autofac和au ...
- C#进阶系列——DDD领域驱动设计初探(二):仓储Repository(上)
前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...
- DDD领域驱动设计初探(二):仓储Repository(上)
前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...
- DDD 领域驱动设计-三个问题思考实体和值对象(续)
上一篇:DDD 领域驱动设计-三个问题思考实体和值对象 说实话,整理现在这一篇博文的想法,在上一篇发布出来的时候就有了,但到现在才动起笔来,而且写之前又反复读了上一篇博文的内容及评论,然后去收集资料, ...
- C#进阶系列——DDD领域驱动设计初探(一):聚合
前言:又有差不多半个月没写点什么了,感觉这样很对不起自己似的.今天看到一篇博文里面写道:越是忙人越有时间写博客.呵呵,似乎有点道理,博主为了证明自己也是忙人,这不就来学习下DDD这么一个听上去高大上的 ...
随机推荐
- 【报错】spring整合activeMQ,pom.xml文件缺架包,启动报错:Caused by: java.lang.ClassNotFoundException: org.apache.xbean.spring.context.v2.XBeanNamespaceHandler
spring版本:4.3.13 ActiveMq版本:5.15 ======================================================== spring整合act ...
- Go -- FIFO类(缓存淘汰算法)(转)
1 FIFO 1.1. 原理 按照“先进先出(First In,First Out)”的原理淘汰数据. 1.2. 实现 FIFO队列,具体实现如下: 1. 新访问的数据插入FIFO队列尾部,数据在FI ...
- linux下添加自动启动项,linux 开机自动启动脚本方法
#service servicename status是当前状态#chkconfig --list servicename是查看启动状态,也就是是否开机自动启动 首先写好脚本,如 mysql,把它放到 ...
- Linux 设备驱动开发 —— platform设备驱动应用实例解析
前面我们已经学习了platform设备的理论知识Linux 设备驱动开发 —— platform 设备驱动 ,下面将通过一个实例来深入我们的学习. 一.platform 驱动的工作过程 platfor ...
- OpenGL - Tessellation Shader 【转】
http://blog.sina.com.cn/s/blog_8c7d49f20102v4qm.html Patch is just an ordered list of vertices (在tes ...
- <LeetCode OJ> 204. Count Primes
Description: Count the number of prime numbers less than a non-negative number, n. 分析: 思路首先:一个数不是合数就 ...
- C++ ADO 连接 mysql
1.安装mysql-5.0.22-win32,mysql-connector-odbc-5.1.12-win32.msi 然后:开始菜单->设置->控制面板->管理工具-> ...
- basePath 方便
String path = request.getContextPath()+"/";String basePath = request.getScheme() + ": ...
- C#实现网段扫描
目录1.使用的类2.获取本地主机IP地址3.远程查询4.实现网段的扫描 ---------------------------------------------------------------- ...
- windows快捷键大全(转载)
常见用法: F1 显示当前程序或者windows的帮助内容. F2 当你选中一个文件的话,这意味着“重命名” F3 当你在桌面上的时候是打开“查找:所有文件” 对话框 F10或ALT 激活当前程序的菜 ...