1

我正在使用 Entity Framework 4 创建一个 ASP.NET MVC 3 应用程序。我正在使用存储库/服务模式并正在寻找反馈。

我目前有以下内容:

MVC 应用程序 (GTG.dll)

  • GTG
  • GTG.控制器
  • GTG.ViewModels

商业 POCO (GTG.Business.dll)

  • 这包含所有业务对象(客户、订单、发票等...)

EF 模型/存储库 (GTG.Data.dll)

  • GTG.Business (GTG.Context.tt) 我使用了实体 POCO 生成器模板。
  • GTG.Data.Repositories

服务层 (GTG.Data.Services.dll)

  • GTG.Data.Services - 包含所有服务对象,每个聚合根一个。

以下是一个小示例代码:

控制器

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
4

1 回答 1

2

您的项目的分离非常好,并且包含它应该的层。问题是你的层之间有很强的耦合,使你的代码无法进行单元测试。

例子:

您的视图模型与服务的特定实现紧密耦合:

_Service = New CustomerService

您的服务与存储库的特定实现紧密耦合:

_Repository = New CustomerRepository

要改进此代码并削弱耦合,您应该考虑使用构造函数注入和 DI 框架。

因此,例如让您的服务构造函数接受一个ICustomerRepository参数并将私有字段分配给它,而不是手动硬编码一个新实例。还要让您的服务实现一个接口并在您的HomeController构造函数中执行相同的构造函数注入,以便它可以访问该服务。

于 2011-02-21T07:22:48.713 回答