我不同意其他人(编辑:艾萨克除外)。小型存储库是一个门面(不是模式)。
如果实体类型是耦合的(彼此具有导航属性),那么它们就不是真正可分离的。
修改一种实体类型并提交更改可能会将更改提交给其他实体。
此外,您不能在同一工作单元之上创建任何小型存储库,
因为 ORM 只有有限数量的实体映射到数据库。
将您的模型划分为可分离的域,并为每个域创建一个特定的工作单元。
在这些工作单元上,为您可能需要立即访问的每个实体类型创建 aggregate roots。
每个根都应该有专门键入的 add、remove、getbykeys、query 等方法。
工作单元上应该有 commitchanges 和类似的方法。
每个根都类似于其他提到的小型存储库,但是,工作单元是真正的中型存储库(您的模型可能有不止一种类型的存储库)。
例子:
// Create one of these
interface IUnitOfWork
{
void Commit();
}
// Create one of these
interface IEntitySet<TEntity> where TEntity : class
{
void Add(TEntity entity);
void Remove(TEntity entity);
TEntity Create<TSpecificEntity>() where TSpecificEntity : TEntity;
IQueryable<TEntity> Query();
}
// Create one of these per entity type
interace IEntitySetOfTEntity1 : IEntitySet<Entity1>
{
TEntity1 GetByKeys(int key1);
}
interace IEntitySetOfTEntity2 : IEntitySet<Entity2>
{
TEntity1 GetByKeys(short key1, short key2);
}
// Create one of these per separatable domain
interface IDomain1UnitOfWork : IUnitOfWork
{
IEntitySetOfTEntity1 Entity1s
{
get;
}
IEntitySetOfTEntity2 Entity2s
{
get;
}
}
所有这些接口及其实现都可以自动生成。
这些接口及其实现非常轻巧,绝不是“具有大量方法的巨大类”。由于它们可以自动生成,因此易于维护。
可以使用以下方法将特定功能添加到接口 IDomain1UnitOfWork、IEntitySetOfTEntity1 等:
一种。扩展方法
湾。部分接口和类(不太推荐,因为这会导致 DAL 不太干净)
如果您使用扩展方法将 GetByKeys() 方法添加到 IEntitySet,则可以忽略 IEntitySetOfTEntity1 类接口。