ASP.NET mvc linq 2 SQL模型:业务逻辑在哪里?

时间:2010-09-16 12:16:24

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

我正在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一起使用?

3 个答案:

答案 0 :(得分:2)

此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)

你需要查看MVC之外的模式,例如,Repository模式可能是一个很好的地方,让LIN2SQL在它和你的控制器之间建立一个BLL(业务逻辑层)来做业务逻辑

答案 2 :(得分:1)

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