繁体   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