项目命名公约反馈请

时间:2011-02-21 04:46:15

标签: asp.net-mvc-3 repository-pattern projects-and-solutions service-layer

我正在使用Entity Framework 4创建一个ASP.NET MVC 3应用程序。我正在使用Repository / Service Pattern并正在寻找反馈。

我目前有以下内容:

MVC应用程序(GTG.dll)

  • GTG
  • GTG.Controllers
  • 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

1 个答案:

答案 0 :(得分:2)

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

示例:

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

_Service = New CustomerService

您的服务与存储库的特定实现紧密相关:

_Repository = New CustomerRepository

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

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