简介
实体仓库是领域驱动设计中的重要概念,它的作用是管理实体,持久化并保存所有实体。实体的所有状态变更,都需要保存到仓库中去,包括新加实体、删除现有实体、修改实体的状态。同时,要获取任意一个实体,也需要通过实体仓库。
关于 DDD 的概念,参考: [Rafy 与经典 DDD 的关系](../领域实体框架\其它\Rafy 与经典 DDD 的关系.html)。
仓库类型
仓库类型代码示例如下:
/// <summary>
/// 仓库 仓库类。
/// 负责 仓库 类的查询、保存。
/// </summary>
public partial class WarehouseRepository : EntityRepository
{
/// <summary>
/// 单例模式,外界不可以直接构造本对象。
/// </summary>
protected WarehouseRepository() { }
}
仓库类型有以下特点:
- 每个实体都对应一个仓库类型。
- 仓库类型必须遵守以下命名约定:仓库类型名称 = 实体类型名称 + "Repository"。
- 仓库类型必须直接或间接继承自 EntityRepository 类型。
- 实体仓库,被设计为单例模式。
即每个实体的仓库,在整个系统中只有唯一一个运行时对象。仓库类型的构建函数不能公开,通过仓库工厂来获取仓库对象。
仓库外观 Api
由于仓库是单例的,在整个系统运行时只会存在一个仓库的实例。所以我们需要通过仓库工厂来获取唯一的这个仓库对象。
类型是仓库相关的外观 Api,全称是 RepositoryFacade,其中包含了仓库工厂的 Api。(仓库外观 Api 的使用频率比较大,所以使用拼音缩写。另外,如果使用中觉得缩写不方便,框架提供了同样功能、全称的 RepositoryFacade 类型。)
我们可以通过该类的以下两个方法来获取指定的仓库对象:
- 直接通过指定的仓库类型来获取其运行时仓库对象:
public static TRepository ResolveInstance() where TRepository : EntityRepository - 通过实体类型来获取其唯一的仓库:
public static EntityRepository Find(Type entityType)
建议通过 ResolveInstance 方法获取仓库,该方法经过优化,速度比方法要快许多。
CarRepository carRepo = RF.ResolveInstance<CarRepository>();