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这么一个听上去高大上的 ...
随机推荐
- ios- nil NULL 和 NSNull
因为objective-c的集合对象,比如nsarray, nsdictionary, nsset等,都有可能包含nsnull对象,所以,如果以下代码中的item为nsnull,则会引起程序崩溃. N ...
- mac下mysqldump找不到命令
之所以会出现MySQL或者mysqldump这样的命令找不到, 我们可以打开/usr/bin文件夹,发现bin目录中并没有mysql打头的UEF文件, 而在/usr/local/mysql/bin中可 ...
- Win7下Nginx的安装与配置
1. 下载nginx1.9.9版本:(版本随时间而变,下载最新即可) http://nginx.org/download/nginx-1.9.9.zip 2. 解压软件到对应位置,并重命名文件夹为n ...
- Hibernate调试——定位查询源头
本文是我在importNew翻译的文章,首发在importNew,这里会定期更新链接. 为什么有时Hibernate会在程序某一部分生成一条指定sql查询?这个问题让人非常难立马理解.当处理不是我们本 ...
- Git 常用场景操作
git init 在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个repo,并在当前文件夹下创建一个.git文件夹. git clone 获取一个u ...
- Vue.js 使用cordova camera插件调取相机
本文给出在vue.js里如何使用cordova的插件完成调取相机及图库,并完成图片上传的操作.具体的操作步骤如下 第一步:在cordova项目下安装cordova-plugin-camera插件 co ...
- meta标签多种用法
<meta name=”google” content=”notranslate” /> <!-- 有时,Google在结果页面会提供一个翻译链接,但有时候你不希望出现这个链接,你可 ...
- redis 3.0.1 在CentOS上的安装
一.下载 wget http://download.redis.io/releases/redis-3.0.1.tar.gz 二.解压 tar xzf redis-3.0.1.tar.gz 三.进入 ...
- struct platform_device中的id成员
include/linux/platform_device.h #define PLATFORM_DEVID_NONE (-1) #define PLATFORM_DEVID_AUTO (-2) dr ...
- Linux CenOS Python3 和 python2 共存
1.查看是否已经安装Python CentOS 7.2 默认安装了python2.7.5 因为一些命令要用它比如yum 它使用的是python2.7.5. 使用 python -V 命令查看一下是否安 ...