2014-01-23 2 views
2

Я хочу иметь один репозиторий для всех моих классов/сущностей. Все контроллеры из приложения MVC должны иметь возможность использовать этот репозиторий без создания новых экземпляров. Репозиторий должен иметь извлеченный интерфейс для тестирования или в других целях, поэтому класс репозитория не будет статическим, поскольку статические классы не могут реализовать интерфейсы. Тем не менее, он будет иметь статическое свойство, которое будет доступно без создания экземпляра класса Repository. Конструктор может быть избыточным или заменен методом. Пожалуйста, дайте мне знать, если это хорошая реализация или плохая практика. Или дайте мне знать, если можно было бы как-то улучшить:Определение репозитория для лучшей практики MVC

public class Repository : IRepository 
{ 
    private MyDBContext context; 

    private static Repository _instance; 
    public static Repository Instance 
    { 
     get 
     { 
      if(_instance == null) 
      { 
       _instance = new Repository(new MyDBContext()); 
      } 
      return _instance; 
     }    
    } 

    public Repository(MyDBContext context) 
    { 
     this.context = context;  
     if(_instance == null) 
     { 
      _instance = new Repository(context); 
     } 
    } 

    ... 

} 
+0

после использования большего количества dbContext, я обнаружил, что совместное использование экземпляра dbContext не является хорошим из-за проблем параллелизма или побочных эффектов удаления. Поэтому то, что я намеревался, не должно быть сделано в любом случае, остерегайтесь! –

ответ

0

Нет ничего технически неправильно в том, что вы предлагаете. Однако есть некоторые улучшения. Статический конструктор гарантированно запускается один раз и только один раз перед первым вызовом статического члена. Поэтому вы удаляете условие гонки, которое у вас было в коде, когда 2 метода вызывают свойство экземпляра. Оператор null coalescing в конструкторе означает, что вы получаете реализацию по умолчанию, но вы можете переопределить его для тестирования.

public class Repository : IRepository 
{ 
    private MyDBContext context; 

    public static IRepository Instance 
    { 
     get; 
     private set;    
    } 

    static Repository() 
    { 
     Instance = new Repository(null); 
    } 

    public Repository(MyDBContext context) 
    { 
     this.context = context ?? new MyDBContext();  
    } 
} 
+0

Действительно, ваше предлагаемое решение кажется более четким и лучшим. Спасибо! –

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