среда, 17 марта 2010 г.

MVC Repository pattern VB

Вот такие ключевые слова мне понадобились для работы над моим первым MVC проектом. Начал я с изучения проекта Nerddinner http://nerddinnerbook.s3.amazonaws.com/Intro.htm Именно там и используется Repository. То есть набор методов над LINQ to SQL для работы с базой данных. Вот пример добавления строки в таблицу dinner:

public void Add(Dinner dinner) {
db.Dinners.InsertOnSubmit(dinner);
}


Вот пример поиска по ID в таблице dinner:

public Dinner GetDinner(int id) {
return db.Dinners.SingleOrDefault(d => d.DinnerID == id);
}


Так как в проекте Nerddinner используется только одна таблица, то это разработчиков устраивает. Но в моей базе данных 7 таблиц, и видимо есть способ не писать один и тот же код для всех таблиц. И вот в инете нахожу ссылку на универсальный Repository.
http://mikehadlow.blogspot.com/2008/03/using-irepository-pattern-with-linq-to.html
Только мне нужен на VB.
И вот предлагаю небольшую адаптацию написанную на VB.
Добавление записи в таблицу:

Public Sub Add(Of T)(ByRef Tab As T)
dc.GetTable(GetType(T)).InsertOnSubmit(Tab)
End Sub

Action метод для создания записи в таблице Printer будет такой:

Function CreatePrinter(ByVal Row As Printer) As ActionResult
Try
Datawork.Add(Of Printer)(Row)
Datawork.Save()
Return RedirectToAction("Printer")
Catch
Return View()
End Try
End Function


Удаление делается аналогично:

Public Sub Delete(Of T)(ByRef Tab As T)
dc.GetTable(GetType(T)).DeleteOnSubmit(Tab)
End Sub

А вот универсальный поиск по ID оказался для меня сложнее.

Public Function GetbyID(Of T)(ByVal ID As Int32) As T
Dim NameOfTable As ParameterExpression = Expression.Parameter(GetType(T), "x")
Dim lambda1 As Expression(Of Func(Of T, Boolean)) = _
Expression.Lambda(Of Func(Of T, Boolean))( _
Expression.Equal(Expression.Property(NameOfTable, "ID"), Expression.Constant(ID, GetType(Integer))), _
New ParameterExpression() {NameOfTable})
Return CType(dc.GetTable(GetType(T)), IQueryable(Of T)).SingleOrDefault(lambda1)
End Function

Для понимания Lambda Expression рекомендую ссылку http://chakkaradeep.wordpress.com/2008/04/14/c-30-language-enhancements-for-linq-part-3-expression-trees/ . Мне она очень помогла.

Комментариев нет:

Отправить комментарий