【问题标题】:ASP.NET mvc linq 2 SQL model : where is the business logic?ASP.NET mvc linq 2 SQL 模型:业务逻辑在哪里?
【发布时间】:2010-09-16 12:16:24
【问题描述】:

我正在 ASP.NET 中构建第一个 MVC 应用程序,并且我正在使用 link2SQL 模型来处理数据。 microsoft 站点上的所有教程都允许您在控制器中编写 LINQ 代码以获取数据并将其传递给视图,如下所示:

 Function Index() As ActionResult
        Dim datacontext As New ErrorVaultDataContext
        Dim questions = From q In datacontext.Questions
                            Where q.fk_status_id = 1
                            Order By q.date Descending
                            Select q
        Return View(questions)
    End Function

这行得通,但让我不知道在哪里放置我的业务逻辑。我想实现诸如“这个用户可以得到这个数据吗?”之类的业务逻辑。在这个简单的例子中。

有谁知道这如何与 linq 2 SQL 结合使用?

【问题讨论】:

    标签: asp.net asp.net-mvc model


    【解决方案1】:

    此 LINQ 查询是业务逻辑。问题是在这个例子中它是硬编码在控制器中的,因此它与数据库相关联。

    你可以把它抽象成一个接口来执行这个查询,这样你的控制器就不再依赖于datacontext。然后你可以实现这个接口来执行实际的数据访问:

    Public Interface IBusinessRepository
        Function GetQuestions(statusId As Integer) As IEnumerable(Of Question)
    End Interface
    
    Public Class BusinessRepositorySql
        Implements IBusinessRepository
        Public Function GetQuestions(statusId As Integer) As IEnumerable(Of Question) Implements IBusinessRepository.GetQuestions
            ' TODO: Perform the data access here
            Throw New NotImplementedException()
        End Function
    End Class
    

    然后控制器可以使用业务逻辑(在这种情况下,它只需要通过某些条件过滤问题):

    Public Class HomeController
        Inherits Controller
        Private ReadOnly _repository As IBusinessRepository
        Public Sub New(repository As IBusinessRepository)
            _repository = repository
        End Sub
    
        Public Function Index() As ActionResult
            Dim questions = _repository.GetQuestions(1)
            Return View(questions)
        End Function
    End Class
    

    然后您可以构建一个custom controller factory,它将在控制器中注入正确的实现。

    【讨论】:

    • 谢谢,这似乎合乎逻辑,但话又说回来,我将创建 1. 模型,2. 该模型的接口,3. 使用模型接口的 BLL 类,这只是对我来说似乎有点矫枉过正?
    • @jorre 这一切都取决于,如果你有一个小的简单站点,那么控制器中的逻辑并不是更糟糕的事情,因为站点变得更加复杂和更大,然后分离关注点和使用正确模式的回报更多
    【解决方案2】:

    您需要查看 MVC 之外的模式,例如存储库模式可能是放置 LIN2SQL 然后在它和您的控制器之间构建 BLL(业务逻辑层)以执行业务逻辑的好地方

    【讨论】:

      【解决方案3】:

      我同意 Pharabus 的观点,无论您使用哪个表示层(webforms 与 mvc),您都可能希望将业务逻辑封装在它自己的层中。这样,您的控制器操作将调用服务/业务层对象,而不是直接使用 ORM (EF/linq2sql) 上下文。

      【讨论】: