«Репозиторий» — один из наиболее часто используемых паттернов проектирования при работе с базами данных (БД). Он позволяет отделить программную логику, работающую непосредственно с БД, от всей остальной программы выступая посредником меду ними с помощью интерфейса во многом схожего с коллекциями.
В чем преимущество использования паттерна «Репозиторий»?
- Отделение программной логики работающей непосредственно с БД от всей остальной программы. Если требуется изменить логику работы с БД или даже тип БД (например, перенос БД с MS SQL Server на MySQL), то внесение изменений осуществляется локально и централизованно. Нет необходимости вносить многочисленные правки по всей программе с вероятностью что-либо пропустить и тем самым спровоцировать ошибку в работе программы.
- С помощью «Репозитория» можно значительно упростить и алгоритмы по работе с БД в остальной программе. Чаще всего для выполнения какой-либо операции с БД достаточно вызвать один из методов класса реализующего этот паттерн.
В «джентельменский набор» при реализации «Репозитория» обычно включается следующий функционал:
- Создание (Create). Добавление записи в БД;
- Чтение (Read). Выборка имеющихся записей из БД;
- Обновление (Update). Редактирование имеющихся записей;
- Удаление (Delete) имеющихся записей.
Иначе говоря, CRUD.
В силу своих особенностей паттерн «Репозиторий» удобнее всего реализовать на основе какой-либо ORM библиотеки. Например, входящих в состав .NET Framework, LINQ to SQL и Entity Framework.
Рассмотрим пример реализации паттерна «Репозиторий» на основе LINQ to SQL.
Вначале определим закрытое поле для контекста БД и инициализируем его в конструкторе класса.
1 2 3 4 5 |
private dbDataContext _dc; public TestRepository(dbDataContext dataContext) { _dc = dataContext; } |
С помощью этого поля и будут производиться все операции над БД. Для того чтобы их реализовать воспользуемся средствами LINQ to SQL, как показано ниже.
Выборка коллекции записи:
1 2 3 |
{ return from r in _dc.Test orderby r.Name select r; } |
Как вариант, просто:
1 2 3 4 |
public IEnumerable<Test> GetTests() { return _dc.Test; } |
1 2 3 4 |
public Test GetTest(int testId) { return _dc.Tests.SingleOrDefault(t => t.id == testId); } |
1 2 3 4 5 6 7 8 |
public Test CreateTest(string TestName) { Test t = new Test(); t.Name = TestName; _dc.Test.InsertOnSubmit(t); _dc.SubmitChanges(); return t; } |
1 2 3 4 5 6 |
public void UpdateTest(Tests t) { Tests dbTest = GetTest(t.id); dbTest.Name = t.Name; _dc.SubmitChanges(); } |
1 2 3 4 5 |
{ Tests delTest = GetTest(testId); _dc.Test.DeleteOnSubmit(delTest); _dc.SubmitChanges(); } |
Теперь все CRUD операции для работы с таблицей Test можно выполнять с помощью созданного нами «Репозитория». Например, выборка данных будет выглядеть следующим образом:
1 |
dataGridView.DataSource= testReposiory.GetTests(); |
1 2 |
int a=15; testReposiory.DeleteTest(a) |
Если необходимо сделать так, чтобы можно было работать с разными системами управления БД (СУБД), то эта задача также легко решается с помощью паттерна «Репозиторий».
Для этого необходимо разработать общий для всех используемых СУБД интерфейс и реализовать его в виде классов-«репозиториев» для каждой СУБД.
Пример такого интерфейса для рассматриваемой в этой статье таблицы Test приведён ниже:
1 2 3 4 5 6 7 8 |
interface ITestRepository { Tests CreateTest(string TestName, int sbj_id); void DeleteTest(int testId); Test GetTest(int testId); System.Collections.Generic.IEnumerable<Test> GetTest(Subjects sbj); void UpdateTest(Tests t); } |
Добавить комментарий