私はまだこれに頭を悩ませています。次のようにレイヤー(dll)を分離したい:
1) MyProject.Web.dll - MVC Web アプリ (コントローラー、モデル (編集/表示)、ビュー)
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 としての Property Context があるため、EF にも密接に結合されています。悪い?
3) これを簡単にするために DI を使用するにはどうすればよいですか?
テストのために、これを可能な限り疎結合にしたいと考えています。助言がありますか?
- - - - - 編集 - - - - -
ここで正しい軌道に乗っているかどうか教えてください。また、サービスには IRepository(Of Category) の権利が注入されますが、それと EFRepository(Of T) の具象クラスとの違いをどのように認識しますか? UnitOfWork と Service と同じですか?
誰かが私が理解できるところまでこれを理解するのを手伝ってくれたら、それは些細なことのように思えるでしょうが、私はこれに頭を悩ませています!!
コントローラ
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