2016-10-25 3 views
3

У меня есть четыре очень похожих, но иерархических объекта. Каждый из них имеет внешний ключ к предыдущему и содержит коллекции следующих.Образец репозитория: Работа с идентичными репозиториями

Part of entity

Сейчас эти объекты имеют четыре одинаковых репозиториев:

Repository

Реализации этих двух методов будет немного отличаться для каждого.

Есть ли шаблон дизайна, который позволит мне объединить все четыре в один, в то же время позволяя мне расширить функциональность при необходимости?

Я пытался сделать это:

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 продолжают аналогичным образом.

Однако, это не похоже на наиболее оптимальное решение, поэтому я вернулся обратно к hodgepoda интерфейсов и классов, которые у меня есть сейчас (по два на каждый репозиторий).

Спасибо

+0

Они должны оставаться отдельными. Разделение проблем. Принцип единой ответственности. Сейчас они, похоже, тесно связаны, но в будущем, кто знает. К тому времени, может быть, слишком поздно отделять их без большого количества рефакторинга и повторной записи. –

+0

Это похоже на вопрос о сборщиках запросов структуры Entity, да, это можно сделать ... но стоит ли это все время и усилия, в большинстве случаев это не так. Но эй, еще интересный вопрос. –

ответ

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

В качестве альтернативы вы могли бы поставить общий на весь репозиторий.

 Смежные вопросы

  • Нет связанных вопросов^_^