我有四个非常相似但层次分明的实体。每个都有一个以前的外键,并包含下一个的集合。
目前,这些实体有四个相同的存储库:
两种方法的实现方式各有所不同。
是否有设计模式允许我将所有四个合并为一个,同时允许我在需要时扩展功能?
我试着这样做:
public class DivisionRepository : IDivisionRepository
{
private DbContext dbContext;
private IDbSet<PrimaryDivision> primaryDivisionsEntitySet;
private IDbSet<SecondaryDivision> secondaryDivisionsEntitySet;
private IDbSet<TertiaryDivision> tertiaryDivisionsEntitySet;
private IDbSet<QuaternaryDivision> quaternaryDivisionsEntitySet;
public DivisionRepository(DbContext dbContext)
{
this.dbContext = dbContext;
this.primaryDivisionsEntitySet = dbContext.Set<PrimaryDivision>();
this.secondaryDivisionsEntitySet = dbContext.Set<SecondaryDivision>();
this.tertiaryDivisionsEntitySet = dbContext.Set<TertiaryDivision>();
this.quaternaryDivisionsEntitySet = dbContext.Set<QuaternaryDivision>();
}
public IDivision Find(Type type, object id)
{
if (type == typeof(PrimaryDivision))
{
return this.primaryDivisionsEntitySet.Find(id);
}
else if (type == typeof(SecondaryDivision))
{
return this.secondaryDivisionsEntitySet.Find(id);
}
else if (type == typeof(TertiaryDivision))
{
return this.tertiaryDivisionsEntitySet.Find(id);
}
else if (type == typeof(QuaternaryDivision))
{
return this.quaternaryDivisionsEntitySet.Find(id);
}
throw new ArgumentException("The type provided was incorrect.");
}
CRUD操作以类似方式继续。
然而,它似乎不是最优的解决方案,所以我回到了我现在拥有的接口和类的大杂烩(每个存储库两个)。
谢谢
答案 0 :(得分:2)
我会使用我称之为composable repository的方式执行此操作。
public static T SpecialFind(this IQueryable<T> entities, int id) where T: IDivision
{
return entities.FirstOrDefault(x=>x.Id == id);
}
用法:
ctx.TertiaryDivisions.SpecialFind(1);
这样做的好处是它提供了非常好的重用模式,尤其是在更复杂的场景下。
但是,如果您完全设置了存储库模式,则适用相同的基本原则:
public T Find<T>(object id) where T : IDivision
{
return dbContext.Set<T>().Find(id);
}
或者,您可以将通用放在整个存储库中。