Шаблон репозитория с EF 4 - Я на правильном пути? - PullRequest
0 голосов
/ 11 марта 2011

Итак, последние несколько недель я вбиваюсь головой в стену, пытаясь получить весь этот шаблон Service / Repository / UnitOfWork, и я пришел к следующим выводам и хотел посмотреть, считают ли какие-либо эксперты, что я нахожусь.правильный путь.

Я использую Ninject для внедрения этих интерфейсов в конструкторы каждого слоя.

Я использую RepositoryBase (Of TEntity), из которого будут создаваться и реализовываться все мои конкретные репозитории.их собственный интерфейс:

Интерфейсы

Public Interface IUnitOfWork
    Inherits IDisposable

    Sub Commit()

End Interface

Public Interface IRepository(Of TEntity As Class)
    Function Query(Predicate As Expressions.Expression(Of Func(Of TEntity, Boolean))) As IQueryable(Of TEntity)
    Function GetAll() As IEnumerable(Of TEntity)
    Function GetFirst(Predicate As Expressions.Expression(Of Func(Of TEntity, Boolean))) As TEntity
    Function GetSingle(Predicate As Expressions.Expression(Of Func(Of TEntity, Boolean))) As TEntity
    Sub Add(Entity As TEntity)
    Sub Attach(Entity As TEntity)
    Sub Delete(Entity As TEntity)
    Sub Save(Entity As TEntity)

End Interface

Public Interface ICategoryRepository
    Function GetCategories() As IEnumerable(Of Category)
    Function GetCategoryByID(ID As Integer) As Category
    Sub SaveCategory(Category As Category)

End Interface

Реализации репозитория / UnitOfWork

Public MustInherit Class RepositoryBase(Of TEntity As Class)
    Implements IRepository(Of TEntity)

    Protected Context As GTGContext
    Protected ObjectSet As ObjectSet(Of TEntity)

    Public Sub New(UnitOfWork As IUnitOfWork)
        Context = CType(UnitOfWork, UnitOfWork).Context
        ObjectSet = Context.CreateObjectSet(Of TEntity)()

    End Sub

    Protected Sub Add(Entity As TEntity) Implements Core.Interfaces.IRepository(Of TEntity).Add
        ObjectSet.AddObject(Entity)
    End Sub

    Protected Sub Attach(Entity As TEntity) Implements Core.Interfaces.IRepository(Of TEntity).Attach
        ObjectSet.Attach(Entity)
    End Sub

    Protected Sub Delete(Entity As TEntity) Implements Core.Interfaces.IRepository(Of TEntity).Delete
        ObjectSet.DeleteObject(Entity)
    End Sub

    Protected Function GetAll() As System.Collections.Generic.IEnumerable(Of TEntity) Implements Core.Interfaces.IRepository(Of TEntity).GetAll
        Return ObjectSet.AsEnumerable
    End Function

    Protected Function GetFirst(Predicate As System.Linq.Expressions.Expression(Of System.Func(Of TEntity, Boolean))) As TEntity Implements Core.Interfaces.IRepository(Of TEntity).GetFirst
        Return ObjectSet.First(Predicate)
    End Function

    Protected Function GetSingle(Predicate As System.Linq.Expressions.Expression(Of System.Func(Of TEntity, Boolean))) As TEntity Implements Core.Interfaces.IRepository(Of TEntity).GetSingle
        Return ObjectSet.Single(Predicate)
    End Function

    Protected Function Query(Predicate As System.Linq.Expressions.Expression(Of System.Func(Of TEntity, Boolean))) As System.Linq.IQueryable(Of TEntity) Implements Core.Interfaces.IRepository(Of TEntity).Query
        Return ObjectSet.Where(Predicate)
    End Function

    Protected Sub Save(Entity As TEntity) Implements Core.Interfaces.IRepository(Of TEntity).Save

    End Sub

End Class

Public Class CategoryRepository
    Inherits RepositoryBase(Of Category)
    Implements ICategoryRepository

    Public Sub New(UnitOfWork As IUnitOfWork)
        MyBase.New(UnitOfWork)

    End Sub

    Public Function GetCategories() As System.Collections.Generic.IEnumerable(Of Core.Entities.Category) Implements Core.Interfaces.ICategoryRepository.GetCategories
        'Return GetAll()
        Return Context.Categories.Include("SubCategories").AsEnumerable

    End Function

    Public Function GetCategoryByID(ID As Integer) As Core.Entities.Category Implements Core.Interfaces.ICategoryRepository.GetCategoryByID
        Return GetSingle(Function(x) x.ID = ID)

    End Function

    Public Sub SaveCategory(Category As Core.Entities.Category) Implements Core.Interfaces.ICategoryRepository.SaveCategory
        ObjectSet.First(Function(x) x.ID = Category.ID)
        ObjectSet.ApplyCurrentValues(Category)

    End Sub

End Class

Public Class UnitOfWork
    Implements IUnitOfWork

    Public Property Context As GTGContext

    Public Sub New()
        _Context = New GTGContext

    End Sub

    Public Sub Commit() Implements Core.Interfaces.IUnitOfWork.Commit
        _Context.SaveChanges()

    End Sub

#Region "IDisposable Support"

    Private _IsDisposed As Boolean

    Protected Overridable Sub Dispose(Disposing As Boolean)
        If (Not _IsDisposed) Then
            If (Disposing) Then
                If (_Context IsNot Nothing) Then
                    _Context.Dispose()
                End If
            End If
        End If

        _IsDisposed = True

    End Sub

    Public Sub Dispose() Implements IDisposable.Dispose
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub

#End Region

End Class

Реализации службы

Public MustInherit Class ServiceBase(Of TEntity As Class)
    Implements IService(Of TEntity)

End Class

Public Class CategoryService
    Inherits ServiceBase(Of Category)
    Implements ICategoryService

    Private Repository As ICategoryRepository

    Public Sub New(Repository As ICategoryRepository)
        Me.Repository = Repository

    End Sub

    Public Function GetCategories() As System.Collections.Generic.IEnumerable(Of Core.Entities.Category) Implements Core.Interfaces.ICategoryService.GetCategories
        Return Repository.GetCategories

    End Function

    Public Function GetCategoryByID(ID As Integer) As Core.Entities.Category Implements Core.Interfaces.ICategoryService.GetCategoryByID
        Return Repository.GetCategoryByID(ID)

    End Function

    Public Sub SaveCategory(Category As Core.Entities.Category) Implements Core.Interfaces.ICategoryService.SaveCategory
        Repository.SaveCategory(Category)

    End Sub

End Class

Какие недостатки вы видите здесь?Предложения?MAGIC?:)

Ответы [ 2 ]

2 голосов
/ 11 марта 2011

Похоже, я отвечаю на вопрос каждый день на одну и ту же тему.:))

В любом случае - на вопрос - я согласен с @qes.

Суть брака Сервис / Репозиторий заключается в том, что ваши Репозитории просты, и Сервис должен предоставить логику для выполнения запросов.Ваша служба должна иметь специальные методы, необходимые для «потребителя» (приложение MVC), например:

public ICollection<Order> FindOrdersForCustomer(int customerId)
{
   return _orderRepository
      .Query()
      .Where(order => order.CustomerId == customerId)
      .ToList();
}

Простая упаковка вызовов не имеет смысла.Ваша служба должна выступать в качестве фасада между вашим приложением MVC и вашим базовым репозиторием.

По сути, ваш OrderRepository (например) определяет операции с заказами.Ваш OrderService должен предоставить все возможные способы добавления / извлечения / сохранения / удаления Ордера.

Именно поэтому я не являюсь поклонником "Single", "Сначала "," Все "методы в репозитории.

У меня есть только один метод" Чтение ", называемый" Поиск ".

Служба должна иметь" Единый "," Первый ", «Все» методы, просто используя базовый LINQ для материализации метода Find.

Ваш репозиторий является чрезмерно сложным IMO.

Интерфейс моего репозитория имеет только 3 метода:

IQueryable<T> Find()
void Save(T entity)
void Delete(T entity)

И мой интерфейс службы имеет значение от 5 до 20.

0 голосов
/ 11 марта 2011

Какой смысл в классе Service, если он только код проходит через репозиторий?

...