с MEF и шаблоном репозитория (также использует EFCodeFirst).

сих пор с трудом оборачиваюсь вокруг этого. Я хочу разделить свои слои (DLL) следующим образом:

1) MyProject.Web.dll - MVC Web App (Контроллеры, Модели (Редактировать / Просмотреть), Представления)
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

Ответы на вопрос(4)

Ваш ответ на вопрос