我正在使用Entity Framework 4创建一个ASP.NET MVC 3应用程序。我正在使用Repository / Service Pattern并正在寻找反馈。
我目前有以下内容:
MVC应用程序(GTG.dll)
商业POCO(GTG.Business.dll)
EF模型/存储库(GTG.Data.dll)
服务层(GTG.Data.Services.dll)
以下是一些示例代码:
控制器
Namespace Controllers
Public Class HomeController
Inherits System.Web.Mvc.Controller
Function Index() As ActionResult
Return View(New Models.HomeViewModel)
End Function
End Class
End Namespace
模型
Namespace Models
Public Class HomeViewModel
Private _Service As CustomerService
Public Property Customers As List(Of Customer)
Public Sub New()
_Service = New CustomerService
_Customers = _Service.GetCustomersByBusinessName("Striano")
End Sub
End Class
End Namespace
服务
Public Class CustomerService
Private _Repository As ICustomerRepository
Public Sub New()
_Repository = New CustomerRepository
End Sub
Function GetCustomerByID(ByVal ID As Integer) As Customer
Return _Repository.GetByID(ID)
End Function
Function GetCustomersByBusinessName(ByVal Name As String) As List(Of Customer)
Return _Repository.Query(Function(x) x.CompanyName.StartsWith(Name)).ToList
End Function
End Class
存储库
Namespace Data.Repositories
Public Class CustomerRepository
Implements ICustomerRepository
Public Sub Add(ByVal Entity As Business.Customer) Implements IRepository(Of Business.Customer).Add
End Sub
Public Sub Delete(ByVal Entity As Business.Customer) Implements IRepository(Of Business.Customer).Delete
End Sub
Public Function GetByID(ByVal ID As Integer) As Business.Customer Implements IRepository(Of Business.Customer).GetByID
Using db As New GTGContainer
Return db.Customers.FirstOrDefault(Function(x) x.ID = ID)
End Using
End Function
Public Function Query(ByVal Predicate As System.Linq.Expressions.Expression(Of System.Func(Of Business.Customer, Boolean))) As System.Linq.IQueryable(Of Business.Customer) Implements IRepository(Of Business.Customer).Query
Using db As New GTGContainer
Return db.Customers.Where(Predicate)
End Using
End Function
Public Sub Save(ByVal Entity As Business.Customer) Implements IRepository(Of Business.Customer).Save
End Sub
End Class
End Namespace
答案 0 :(得分:2)
您的项目分离非常好,并且包含应该完全包含的图层。问题是你的层之间有很强的耦合,使你的代码无法进行单元测试。
示例:
您的视图模型与服务的特定实现紧密耦合:
_Service = New CustomerService
您的服务与存储库的特定实现紧密相关:
_Repository = New CustomerRepository
要改进此代码并削弱耦合,您应该考虑使用构造函数注入和DI框架。
因此,例如,您的服务构造函数将采用ICustomerRepository
参数并将私有字段分配给它,而不是手动硬编码新实例。还要让您的服务实现一个接口,并在HomeController
构造函数中执行相同的构造函数注入,以便它可以访问该服务。