我正在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一起使用?
答案 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)上下文。