Мне все еще трудно осмыслить это. Я хочу разделить свои слои (dll) вот так:
1) MyProject.Web.dll - веб-приложение MVC (контроллеры, модели (редактирование / просмотр), представления)
2) MyProject.Services.dll - уровень обслуживания (бизнес-логика)
3) MyProject.Repositories.dll - Репозитории
4) MyProject.Domain.dll - Классы POCO
5) MyProject.Data.dll - EF4
Рабочий процесс:
1) Контроллеры вызывают службы для получения объектов для заполнения моделей просмотра / редактирования.
2) Службы вызывают репозитории для получения / сохранения объектов.
3) Репозитории вызывают EF для получения / сохранения объектов на SQL Server и из него.
Мои репозитории возвращают IQueryable (Of T), и внутри них они используют ObjectSet (Of T).
Итак, как я вижу, слои зависят именно от следующего уровня и библиотеки, содержащей классы POCO?
Некоторые проблемы:
1) Теперь, чтобы мои репозитории правильно работали с EF, они будут зависеть от System.Data.Objects, теперь у меня есть тесная связь с EF на уровне моего репозитория, это плохо?
2) Я использую шаблон UnitOfWork. Где это должно жить? Он имеет контекст свойства как ObjectContext, так что он также тесно связан с EF. Плохой?
3) Как я могу использовать DI, чтобы упростить эту задачу?
Я хочу, чтобы это было как можно слабее для тестирования. Какие-либо предложения?
---------- Изменить ----------
Пожалуйста, дайте мне знать, если я на правильном пути. Кроме того, так как Служба правильно вводит IRepository (Of Category), как она узнает разницу между этим и конкретным классом EFRepository (Of T)? То же самое с UnitOfWork и Сервисом?
Как только кто-то поможет мне разобраться в этом до того, как я это понимаю, я знаю, что это будет казаться тривиальным, но, черт возьми, я чертовски долго обдумываю это !!
Контроллер
Public Class CategoryController
Private _Service As Domain.Interfaces.IService
Public Sub New(ByVal Service As Domain.Interfaces.IService)
_Service = Service
End Sub
Function ListCategories() As ActionResult
Dim Model As New CategoryViewModel
Using UOW As New Repositories.EFUnitOfWork
Mapper.Map(Of Category, CategoryViewModel)(_Service.GetCategories)
End Using
Return View(Model)
End Function
End Class
Сервис
Public Class CategoryService
Private Repository As Domain.Interfaces.IRepository(Of Domain.Category)
Private UnitOfWork As Domain.Interfaces.IUnitOfWork
Public Sub New(ByVal UnitOfWork As Domain.Interfaces.IUnitOfWork, ByVal Repository As Domain.Interfaces.IRepository(Of Domain.Category))
UnitOfWork = UnitOfWork
Repository = Repository
End Sub
Public Function GetCategories() As IEnumerable(Of Domain.Category)
Return Repository.GetAll()
End Function
End Class
Репозиторий и UnitOfWork
Public MustInherit Class RepositoryBase(Of T As Class)
Implements Domain.Interfaces.IRepository(Of T)
End Class
Public Class EFRepository(Of T As Class)
Inherits RepositoryBase(Of T)
End Class
Public Class EFUnitOfWork
Implements Domain.Interfaces.IUnitOfWork
Public Property Context As ObjectContext
Public Sub Commit() Implements Domain.Interfaces.IUnitOfWork.Commit
End Sub
End Class