2010-09-16 129 views
1

我正在ASP.NET中构建第一个MVC应用程序,并且正在使用link2SQL模型来处理数据。 上微软网站所有教程让你写在控制器LINQ代码来获取数据,并将其传递给视图,就像这样:ASP.NET mvc linq 2 SQL模型:业务逻辑在哪里?

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

回答

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,它将在控制器中注入适当的实现。

+0

感谢,这似乎是逻辑,但是再次,我将创建1.模型,2.该模型的接口,3.使用模型接口的BLL类,对我来说似乎过度? – Jorre 2010-09-16 12:38:03

+0

@jorre这一切都取决于,如果你有一个小的简单网站,然后在控制器中的逻辑是不是更糟糕的事情要做,因为网站变得越来越复杂和更大,然后分离关注和使用适当的模式更有利于更多 – Pharabus 2010-09-16 14:44:14

2

你需要看看超越MVC模式例如Repository模式可能是把LIN2SQL然后建立一个与你的控制器之间的BLL(业务逻辑层)做业务逻辑

1

我的好地方同意Pharabus,无论你使用哪种表示层(webforms vs. mvc),你可能都想将自己的业务逻辑封装在自己的层中。这样你的控制器动作就可以调用服务/业务层对象,而不是直接使用ORM(EF/linq2sql)上下文。