基于仓储的实现

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领域驱动之干货(二)的更多相关文章

  1. DDD领域驱动之干货(四)补充篇!

    距离上一篇DDD系列完结已经过了很长一段时间,项目也搁置了一段时间,想想还是继续完善下去. DDD领域驱动之干货(三)完结篇! 上一篇说到了如何实现uow配合Repository在autofac和au ...

  2. DDD领域驱动之干货 (一)

    说道DDD不得不说传统的架构与DDD的架构区别. 传统的架构不外乎就是三层,而在这三层里面又不断的细分,始终没有达到想要的效果,那么为什么当时还是采用三层. 当然在DDD没有提出的时候三层是大多数人的 ...

  3. [0] DDD领域驱动设计(二) 之 值对象

    DDD中实体对象与值对象的解释比较抽象.主要根据持续性与 ID 识别来区分. ID并非某一对象的直观自然属性,而是在分析建模之 后,赋给模型中的实体类,来达到跟踪,区别,存储目的的一个特值. 结合项目 ...

  4. DDD领域驱动之干货(三)完结篇!

    首先这里发一下结构图,因为是重写的,但是代码都是一样所有如下: 这里我先说一下看了大部分的DDD文章都是采用的WCF做服务,这里呢我用的是webapi做服务,WCF和WEBAPI的区别可以去百度下. ...

  5. DDD领域驱动之干活(四)补充篇!

    距离上一篇DDD系列完结已经过了很长一段时间,项目也搁置了一段时间,想想还是继续完善下去. DDD领域驱动之干货(三)完结篇! 上一篇说到了如何实现uow配合Repository在autofac和au ...

  6. C#进阶系列——DDD领域驱动设计初探(二):仓储Repository(上)

    前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...

  7. DDD领域驱动设计初探(二):仓储Repository(上)

    前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...

  8. DDD 领域驱动设计-三个问题思考实体和值对象(续)

    上一篇:DDD 领域驱动设计-三个问题思考实体和值对象 说实话,整理现在这一篇博文的想法,在上一篇发布出来的时候就有了,但到现在才动起笔来,而且写之前又反复读了上一篇博文的内容及评论,然后去收集资料, ...

  9. C#进阶系列——DDD领域驱动设计初探(一):聚合

    前言:又有差不多半个月没写点什么了,感觉这样很对不起自己似的.今天看到一篇博文里面写道:越是忙人越有时间写博客.呵呵,似乎有点道理,博主为了证明自己也是忙人,这不就来学习下DDD这么一个听上去高大上的 ...

随机推荐

  1. fastscript增加三方控件

    fastscript增加三方控件 A.关于如何使用第三方控件,增加方法.属性.事件)举例如下: 如:有一控件为edtbutton:TedtButton,我们需要在动态脚本中使用该控件.我们采用如下方法 ...

  2. 理解Neural Style

    paperA Neural Algorithm of Artistic Style 在艺术领域,尤其是绘画,艺术家们通过创造不同的内容与风格,并相互交融影响来创立独立的视觉体验.如果给定两张图像,现在 ...

  3. 基于RFS(robot framework selenium)框架模拟POST/GET请求执行自动化接口测试

    打开RIDE添加测试用例 如: Settings         Library Collections       Library RequestsLibrary       Test Cases ...

  4. Python+Selenium框架unittest执行脚本方法之discover()方法

    继续接着介绍,如何利用unittest管理和执行测试用例的问题,这里我们还是利用之前已经有的三条测试用例,如果你跳过了前面文章,请回到框架设计篇的第八篇和第七篇,里面有相关测试类的文件.本文来介绍,如 ...

  5. iframe截取站点的部分内容

    <div style="width:630px;height:350px;overflow:hidden;border:0px">                  & ...

  6. 内核顶层Makefile相关4

    http://www.groad.net/bbs/simple/?f104.html make 的递归执行与 MAKEFLAGS 变量 make 的递归调用是指:在 Makefile 中使用 make ...

  7. PHP中curl获取本机虚拟主机接口

    在PHP的curl代码中增加header可解决此问题. $header = array( "Host: 你的域名(不能包含http://)", "Accept: text ...

  8. c# CacheManager 缓存管理

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. MyBatis学习(一):简单的运行

    1.准备工作 jar包: mybatis-3.4.4.jar,下载地址:https://github.com/mybatis/ignite-cache/releases mysql-connector ...

  10. vue-router 介绍

    vue-router是官方的路由管理工具,用于组建单页面应用很方便快捷.还记得我们在上一篇文章中,使用vue-cli创建的hello-vue的那个项目吗?打开项目,我们先看下目录结构: 看了上面的目录 ...