Весь смысл иметь шаблон хранилища - это разделить различные слои вашего приложения в дополнение к упрощению модульного тестирования вашего приложения.
Правильный способ реализации шаблона хранилища должны иметь интерфейс, который определяет четыре основных методы ...
public interface IEntity
{
string Id { get; set; }
}
public interface IRepository<T> where T : IEntity
{
void Add(T entity);
void Remove(T entity);
void Create(T entity);
T Find(string id);
}
Теперь вы можете реализовать этот интерфейс для любого из ваших сущностей, давайте представим, вы создаете блог, блог будет содержать сообщения правильно?
Таким образом, создать PostsRepository ...
public class Post : IEntity
{
public Post()
{
this.Id = Guid.NewGuid().ToString();
}
public string Id { get; set;}
}
public class PostsRepository : IRepository<Post>
{
public void Add(Post entity);
/// etc
}
Вот как это должно быть реализовано, хотя приведенный выше пример не принимает во внимание, что логика доступа к данным составлена с использованием Entity Framework.
Теперь, когда мы знаем, что Repository шаблон, давайте перейдем к интеграции Entity Framework ...
В PostsRepository
классе вы бы иметь свойство, которое может ссылаться на вашу Entity Framework DbContext. Помните, что PostsRepository
представляет собой конкретную реализацию , которая будет использоваться для любого другого класса, который зависит от IRepository.
Так зачем, кажется много неприятностей для небольшой прибыли, но вы ошибаетесь ...
Представьте себе, что вы пытаетесь проверить содержание в должности, которая представляется веб-сайт ... Как изолировать логику проверки, избегая при этом каких-либо звонков в базу данных?
Вы можете либо создать ручные макетные объекты, реализующие IRepository, которые не ссылаются на EntityFramework в качестве источника данных (это долгой подход) ... или вы могли бы просто использовать доступные там рамки, такие как Moq
, которые вы используете для создания поддельной реализации IRepository.
Так, короче говоря, что вам нужно, чтобы начать изучать это:
- Dependency Inversion
- Repository Pattern
- декоратор
- N-уровневая архитектура
- Луковый архитектура
Все эти факторы окажут существенное влияние на то, насколько поддерживаемое приложение будет иметь место после того, как база кода выросла. Вам не нужно быть экспертом, который будет совершать ошибки и кусать несколько пуль здесь и там ... но общее понимание этих событий будет иметь огромные различия даже в краткосрочной перспективе.
Не положительно, что это исправит вам ошибку, но вы, вероятно, захотите снять «статическую» с вашей переменной-члена. Пометить его как static делает его глобальным для всех экземпляров, которые наследуются от вашего базового класса, и он будет сохраняться во всех запросах. Не то, что вы хотите. – Sam
Я знаю, но это пойнт одноэлементного шаблона, он предположил показать мне классы внутри NORTHWNDContext (это мои классы базы данных) сразу после того, как я написал «Контекст». в методе Listele –
Это может быть точка одноэлементного шаблона, но шаблон singleton не имеет никакого отношения к шаблону репозитория. –