基于仓储的实现

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. 浅析 JavaScript 中的闭包(-------------------------------------------)

    一.前言 对于 JavaScript 来说,闭包是一个非常强大的特征.但对于刚开始接触的初学者来说它又似乎是特别高深的.今天我们一起来揭开闭包的神秘面纱.闭包这一块也有很多的文章介绍过了,今天我就浅谈 ...

  2. Java加密技术(八)——数字证书

    原文:http://snowolf.iteye.com/blog/391931 请大家在阅读本篇内容时先阅读 Java加密技术(四),预先了解RSA加密算法. 在构建Java代码实现前,我们需要完成证 ...

  3. ios 使用 resignFirstResponder 无法hide键盘

    - (BOOL)disablesAutomaticKeyboardDismissal {    return NO;}

  4. 【java】google的zxing架包生成二维码和读取二维码【可带文字和logo】

    承接RC4生成不重复字符串的需求之后,因为优惠码要方便用户使用的缘故,所以思来想去,觉得还是直接生成二维码给用户直接扫比较实用,也不用用户专门记录冗长的优惠码编号. ================= ...

  5. GOPATH设置

    go help gopath查看gopath的原文帮助信息 go env查看gopath的配置 GOPATH与工作空间 前面我们在安装Go的时候看到需要设置GOPATH变量,Go从1.1版本到1.7必 ...

  6. U盘启动时提示starting cmain,3种终极解决方案

    U盘启动时提示“starting cmain”一般是这样子的: <ignore_js_op> 这种情况,一般是制作好了PE启动U盘之后,启动不了才会这样,一般正常情况的话,这一句英文是一闪 ...

  7. C#制作、打包、签名、发布Activex全过程【转】

    http://www.cnblogs.com/still-windows7/p/3148623.html 一.前言 最近有这样一个需求,需要在网页上面启动客户端的软件,软件之间的通信.调用,单单依靠H ...

  8. Eclipse 安装(Oxygen版本)

    Eclipse 安装(Oxygen版本) Eclipse 最新版本 Eclipse Neon,这个首次鼓励用户使用 Eclipse Installer 来做安装,这是一种由Eclipse Oomph提 ...

  9. iOS开发UI篇—懒载入

    iOS开发UI篇-懒载入 1.懒载入基本 懒载入--也称为延迟载入,即在须要的时候才载入(效率低,占用内存小).所谓懒载入,写的是其get方法. 注意:假设是懒载入的话则一定要注意先推断是否已经有了. ...

  10. Azure Mobile App - Custom Authentication

    Custom Authentication: 1. For OLD Mobile Service - https://azure.microsoft.com/en-us/documentation/a ...