调用业务层方法

时间:2014-03-05 06:36:08

标签: c# asp.net asp.net-mvc design-patterns

我是多层架构和asp.net mvc的新手。 我想知道调用业务层方法的好习惯。

1)从控制器调用业务层方法,填充视图模型并将视图模型传递给视图。

2)直接从视图中调用业务层方法。

请让我知道这两种方法的优点和缺点。 如果解释“在哪种情况下使用任何一种方法”,将不胜感激。

2 个答案:

答案 0 :(得分:3)

这接近于寻求意见的问题,但我认为这是值得解释的,尽管你可以通过足够的研究找到它。

选择1是要走的路,可能会达到+ 80%的同意。

再一次,你遇到了“它依赖”的答案。这取决于你需要多少才能解决问题。在学术上你应该松散地加上高凝聚力。一切都很好,但在现实世界中很少有绝对的,因为完美的建筑更多的是“及时”设计而不是学术,否则你永远不会把东西投入生产。所以你作为开发者必须判断你妥协的地方(你会)。

所以这里有基于意见的地方:

a)具有高内聚力的松散耦合意味着更好的可测试性/可维护性/可扩展性,代价是更大的抽象,即更多的开发时间。

b)反过来意味着减少所有商品,但前期开发时间也减少了,也就是说“只是把它拿出来并停止告诉我(你的老板)关于良好的建筑风格!”

优秀的开发人员总是在努力争取a)。问题是我们大多数人必须在取得进展的同时保持平衡,所以我们倾向于向b)(不情愿地)下滑

所以为了进一步讨论(如果你还在阅读)... a)的一个例子,还有很多其他的权利,这只是一种风格:

您的视图模型应包含呈现风味UI所需的所有内容,以及直接从UI调用的视图+函数所需的最少数据。它不应代表与域模型相关的业务逻辑。域模型应该代表必要的数据,以代表它们所包含的域。业务逻辑层(在此处称为服务层)应该是在域上运行的功能。

泽示例:

假设我们有一个拥有多个帐户的用户。会有一个User类和Account类。它们组合在UserAccounts类中(User属性和Accounts属性(数组)。

根据您决定使用域的方式,可以使用UserService类或UserService + AccountService + UserAccountService类组合。

然后让我们假设您有用户(UserView类)和用户详细信息(UserDetailView类)视图。 UserView是User类+帐户的聚合表示(但不是所有细节)+ UI直接调用函数。 UserDetailView代表每个帐户的用户+详细信息+ UI直接调用函数。

用户控制器有两个功能(更多肯定,但只是为了解释),getUsers和getUserDetail。

  • GetUsers调用用户serivce,它返回UserAccounts对象的数组 然后传递给返回UserView数组的模型构建器 控制器然后传递给“摘要”视图的对象。
  • GetUserDetail调用返回UserAccounts的用户服务 然后通过返回a的模型构建器传递的对象 然后控制器传递给的UserDetailView对象 '详细'视图。

答案 1 :(得分:0)

使用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

现在所有控制器需要做的是实例化该模型并将数据提供给视图