我是多层架构和asp.net mvc的新手。 我想知道调用业务层方法的好习惯。
1)从控制器调用业务层方法,填充视图模型并将视图模型传递给视图。
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。
答案 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
现在所有控制器需要做的是实例化该模型并将数据提供给视图