2010-09-16 158 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)上下文。