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这么一个听上去高大上的 ...
随机推荐
- Android学习笔记(35):Android活动条
在Android3.0之后,Google对UI导航设计上进行了一系列的改革,当中有一个很好用的新功能就是引入的ActionBar,用于代替3.0之前的标题栏,并提供更为丰富的导航效果. ActionB ...
- Git学习0基础篇(下)
server上的 Git - 协议 Git能够使用四种基本的协议传输资料:本地协议(Local).HTTP 协议.SSH(Secure Shell) 协议以及 Git 协议.眼下使用最普及的是 SSH ...
- 在windows下安装gulp[转]
一.准备工作 1.什么是 npm? npm 是 nodejs 的包管理工具,主要功能就是管理.更新.搜索.发布node的包.Gulp 就是通过 NPM 安装的.关于 NPM 中文介绍,这里有一篇非常不 ...
- HttpClient通过Post方式发送Json数据
服务器用的是Springmvc,接口内容: @ResponseBody @RequestMapping(value="/order",method=RequestMethod.PO ...
- C - The C Answer (2nd Edition) - Exercise 1-16
/* Revise the main routine of the longest-line program so it will correctly print the length of arbi ...
- 更改已经签名的app中的内容
转载请说明出处http://blog.csdn.net/andywuchuanlong 记得上次在南昌中兴的一个项目中遇到过一个这种需求:一个app能够给多个渠道商去运营,渠道商推广出去能够获得对应的 ...
- 如何防范SQL注入式攻击
一.什么是SQL注入式攻击? 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者 ...
- react 自定义 TabBar 组件
1.创建 组件 src/components/TabBar/index.js /** * TabBar 组件 */ import React ,{ PureComponent } from 'reac ...
- JavaScript 工厂模式和订阅模式
设计模式的好处: 代码规范 // 例如表单验证,两个 input ,一个用户名,一个密码 // 通常做法是 function checkUser(){ //..... } function check ...
- 我的Android进阶之旅------>Android关于Log的一个简单封装
android.util.Log类,能够方便地用于在编码调试过程中打印日志. 可是在公布后的产品中,假设有太多的日志打印.则会严重地影响性能. 对android.util.Log类做一个简单的封装.当 ...