DDD领域驱动设计:仓储 (2)

Get分为通过ID查询或过滤条件进行查询,返回序列中的唯一元素:

public T Get<T>(Guid id, Func<IQueryable<T>, IQueryable<T>> includes = null) where T : AggregateRoot { return Get(w => w.Id.Equals(id), includes: includes); } public T Get<T>(Expression<Func<T, bool>> filter, Func<IQueryable<T>, IQueryable<T>> includes = null) where T : AggregateRoot { return Query(filter, includes: includes).SingleOrDefault(); }

Query 方法使用 lambda 表达式来允许调用代码指定筛选条件,使用一列来对结果进行排序,允许调用方为预先加载导航属性列表:

// 代码 Expression<Func<T, bool>> filter 意味着调用方将基于 AggregateRoot 类型提供 lambda 表达式,并且此表达式将返回一个布尔值。 // 代码 Func<IQueryable<T>, IOrderedQueryable<T>> orderBy 也意味着调用方将提供 lambda 表达式。 但在这种情况下,表达式的输入是 AggregateRoot 类型的 IQueryable 对象。 表达式将返回 IQueryable 对象的有序版本。 // 代码 Func<IQueryable<T>, IQueryable<T>> includes 也意味着调用方将提供 lambda 表达式。 允许预先加载导航属性列表。 public IQueryable<T> Query<T>(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, Func<IQueryable<T>, IQueryable<T>> includes = null) where T : AggregateRoot { IQueryable<T> query = context.Set<T>(); if (filter != null) { query = query.Where(filter); } if (includes != null) { query = includes(query); } if (orderBy != null) { query = orderBy(query); } return query; }

Entry 方法使用 AggregateRoot.AggregateState 来置 context.Entry(t).State 状态,完成增删改

public void Entry<T>(T t) where T : AggregateRoot { switch (t.AggregateState) { case AggregateState.Added: context.Entry(t).State = EntityState.Added; break; case AggregateState.Deleted: context.Entry(t).State = EntityState.Deleted; break; default: context.Entry(t).State = EntityState.Modified; break; } }

Save 等其他方法也类似实现。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssdxs.html