簡體   English   中英

存儲庫模式:處理相同的存儲庫

[英]Repository Pattern: Dealing with Identical Repositories

我有四個非常相似但層次分明的實體。 每個都有一個以前的外鍵,並包含下一個的集合。

實體的一部分

現在,這些實體有四個相同的存儲庫:

知識庫

兩種方法的實現方式各有所不同。

是否有一種設計模式允許我將所有四個合並為一個,同時允許我在需要時擴展功能

我試着這樣做:

 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操作以類似的方式繼續。

然而,它似乎不是最佳解決方案,所以我回到了我現在擁有的接口和類的大雜燴(每個存儲庫兩個)。

謝謝

我會使用我稱之為可組合的存儲庫來執行此操作。

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);
}

或者,您可以將泛型放在整個存儲庫中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM