簡體   English   中英

調用業務層方法

[英]Call Business Layer method

我是多層架構和asp.net mvc的新手。 我想知道調用業務層方法的好習慣。

1)從控制器調用業務層方法,填充視圖模型並將視圖模型傳遞給視圖。

2)直接從視圖中調用業務層方法。

請讓我知道這兩種方法的優缺點。 如果解釋“在哪種情況下使用任何一種方法”,將不勝感激

這是一個尋求意見的問題,但我認為值得一個解釋,盡管你可以通過足夠的研究找到它。

選項1是要走的路,可能會達到+ 80%的同意。

再過一次,你會遇到'依賴'的答案。 這取決於你需要多少才能解決問題。 在學術上你應該松散地加上高凝聚力。 一切都很好,但在現實世界中很少有絕對的,因為完美的建築更多的是“及時”設計而不是學術,否則你永遠不會把東西投入生產。 所以你作為開發者必須判斷你妥協的地方(你會)。

所以這里有基於意見的地方:

a)具有高內聚力的松散耦合意味着更好的可測試性/可維護性/可擴展性,代價是更大的抽象,即更多的開發時間。

b)相反意味着減少所有商品,但前期開發時間也減少了,也就是說“只是把它拿出來,停止告訴我(你的老板)關於好建築的死訊!”

一個優秀的開發人員總是在努力爭取a)。 問題是我們大多數人必須在取得進展的同時保持平衡,因此我們傾向於向b)(不情願)

因此,為了進一步討論(如果你還在閱讀)... a)的一個例子,還有很多其他的權利,這只是一種風格:

您的視圖模型假設包含呈現flavor的UI所需的所有內容,直接從UI調用的view +函數所需的最少數據。 它不應代表與域模型相關的業務邏輯。 域模型應該代表必要的數據,以代表它們所包含的域。 業務邏輯層(在此處稱為服務層)應該是在域上運行的功能。

澤的例子:

假設我們有一個擁有多個帳戶的用戶。 會有一個User類和Account類。 它們組合在UserAccounts類(User屬性和Accounts屬性(數組))中。

根據您決定使用域的方式,可以使用UserService類或UserService + AccountService + UserAccountService類組合。

然后讓我們假設您有用戶(UserView類)和用戶詳細信息(UserDetailView類)視圖。 UserView是User類+帳戶的聚合表示(但不是所有細節)+ UI直接調用函數。 UserDetailView表示每個帳戶的用戶+詳細信息+ UI直接調用功能。

用戶控制器有兩個功能(更多肯定,但只是這些解釋),getUsers和getUserDetail。

  • GetUsers調用用戶serivce,它返回一個UserAccounts對象數組,然后通過模型構建器傳遞,該構建器返回一個UserView對象數組,然后控制器將其傳遞給“summary”視圖。
  • GetUserDetail調用返回UserAccounts對象的用戶服務,然后該對象通過模型構建器傳遞,該構建器返回UserDetailView對象,然后控制器將其傳遞給“詳細”視圖。

使用MVC,您的處理(如調用和填充模型)將屬於模型本身。 控制器需要盡可能“愚蠢”,基本上只是說“好吧我需要這個模型並將其發送到那個視圖”

這是我的一個模型的VB.NET版本(我使用自定義版本的StackOverflow的Dapper ORM作為我的數據庫層。這是一個未完成的模型順便說一句,用戶信息的總體還沒有包含在其中):

Public Class UserAccount    
    Public Property Employee_ID() As Integer
    Public Property Email_Address() As String
    Public Property Location_ID() As String
    Public Property Department_ID() As String
    Public Property Company_ID() As String
    Public Property Password_Expiry() As DateTime
    Public Property Win_User_Name() As String
    Public Property First_Name() As String
    Public Property Last_Name() As String
    Public Property Message_Number() As Integer
    Public Property Message_Text() As String
    Public Property Password() As String

    Public Overrides Function ToString() As String
        Dim serializer As JavaScriptSerializer = New JavaScriptSerializer
        Dim result As String = serializer.Serialize(Me)
        Return result
    End Function

    Public Function FromString(str As String) As UserAccount
        Dim serializer As JavaScriptSerializer = New JavaScriptSerializer
        Return serializer.Deserialize(Of UserAccount)(str)
    End Function

    Public Function GetUserInfo() As UserAccount 'Returns user info as a strongly typed object from what is saved in the cookie
        Dim user As UserAccount
        Dim cookie As HttpCookie = DirectCast(System.Web.HttpContext.Current.Request.Cookies(FormsAuthentication.FormsCookieName), HttpCookie)
        Dim ticket As FormsAuthenticationTicket = FormsAuthentication.Decrypt(cookie.Value)

        user = Me.FromString(ticket.UserData)

        Return user
    End Function

    Public Shared Function Encrypt(password As String, Win_User_Name As String)

        Dim _password As New StringBuilder
        Try

           'encryption stuff happens here
        Catch er As Exception
            Return ""
        End Try

        Return _password.ToString

    End Function

End Class

現在,控制器需要做的就是實例化該模型並將數據提供給視圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM