OOP에 익숙하지 않아이를 처리하는 올바른 방법인지 이해하는 데 도움이 필요합니다. 3 레이어 웹 프로젝트 (+ DTOs)가 있으며 비즈니스 개체에서 프레젠테이션 레이어로 "오류"를 반환하는 가장 좋은 방법임을 이해하려고합니다. 특히 나는 사용자 생성과 마주하고 있습니다. 웹 사이트 등록시 DB에 사용자를 생성하고 실제 사용자에게 사용자 이름 또는 이메일을 이미 가져 왔는지 여부를 알려주고 싶다고 가정 해 봅시다 (이는 단지 예일뿐입니다).비즈니스 레이어에서 ASP.NET 사용자 정의 예외 처리
ASP.NET Membership.CreateUser() 메서드는 MembershipCreateStatus 개체 byRef를 전달하므로이 메서드는 Enum (다른 네임 스페이스에 상주 함)을 반환하여 시도 상태를 전달하는 데 사용됩니다. DuplicateEmail, DuplicateUserName 등이 될 수 있습니다.
예외를 기반으로 다른 방법을 구현했지만 그 점에 대해 귀하의 의견을 말씀드립니다. UI 계층에서 다음
Public Class UserManager
Public Enum ErrorType
DatabaseError = 1
UserExists = 2
EmailExists = 3
End Enum
Public Class ManagerException
Inherits Exception
Public Property ErrorType As ErrorType
Public Property SuggestedUserName As String
Public Property SuggestedEmail As String
Public Sub New()
MyBase.New()
End Sub
Public Sub New(message As String)
MyBase.New(message)
End Sub
Public Sub New(message As String, inner As Exception)
MyBase.New(message, inner)
End Sub
End Class
Public Function CreateUserLogin(user As EvaVwUserLogin) As Guid
If user Is Nothing Then
Throw New ApplicationException("No user suppied")
End If
If String.IsNullOrWhiteSpace(user.Password) OrElse String.IsNullOrWhiteSpace(user.UserName) Then
Throw New ApplicationException("Password or username missing")
End If
If CheckDuplicateUserName() Then
Dim ex As New ManagerException("Username exists")
ex.ErrorType = ErrorType.UserExists
ex.SuggestedUserName = "this username is free"
Throw ex
End If
End Function
End Class
(뒤에 영문 코드) 내가 관리자를 호출하고 같은 예외를 확인 : 사용자를 생성 BLL 관리자 클래스에서 나는 오류 유형이 방법을 중첩 Excpetion 클래스와 중첩 된 열거 형을 생성 이 :
Dim userManager As New UserManager
Try
userManager.CreateUserLogin("test", "test")
Catch ex As UserManager.ManagerException
If ex.ErrorType = userManager.ErrorType.UserExists Then
Dim suggestedUsername = ex.SuggestedUserName
' Display error message and suggested user name
End If
End Try
이 내가이 길을 내려 가면, 각 관리자는 관련 열거 형과의 중첩 ManagerException을 수 있도록 예외와 열거 모두이 관리자에게 매우 구체적인 것을 고려하고, 올바른 방법인가?
언제나처럼 당신의 의견에 미리 감사드립니다.
친절 브라이언과 사이보그가 제시 한 "사용자 지정 코드"시나리오를 따라 당신이 생각 (어쩌면 다른 사용자가 MS의 조언에 관심이 더 완전한 브라이언 그냥 때문에 그의 대답을 표시)가 사용자 정의 반환 객체를 중첩 관리자 클래스의 상대적 열거 형은 좋은 아이디어일까요? 이 열거 형은이 관리자 클래스와 엄격하게 관련이 있으므로 (BLL의 각 managar 클래스는 자신 만 소유하게됩니다) 상태 코드가 전달 될 때 계속 사용할 수 있다고 생각합니까?
편집 :이 방법으로 리팩터링했는데 ... 괜찮습니까?
Public Class UserManager
Public Enum ErrorType
DatabaseError = 1
UserExists = 2
EmailExists = 3
End Enum
Public Class ErrorData
Public Property ErrorType As ErrorType
Public Property SuggestedUserName As String
Public Property SuggestedEmail As String
End Class
Public Function CreateUserLogin(username As String, password As String, ByRef errorData As ErrorData) As Guid
Dim user As New EvaVwUserLogin
user.UserName = username
user.Password = password
Return CreateUserLogin(user, errorData)
End Function
Public Function CreateUserLogin(user As EvaVwUserLogin, ByRef errorData As ErrorData) As Guid
If user Is Nothing Then
Throw New ApplicationException("No user object")
End If
If String.IsNullOrWhiteSpace(user.Password) OrElse String.IsNullOrWhiteSpace(user.UserName) Then
Throw New ApplicationException("Missing password or username")
End If
Dim hashedPassword As String
hashedPassword = Crypto.HashPassword(user.Password)
If UserExists(user) Then
errorData.ErrorType = ErrorType.UserExists
errorData.SuggestedUserName = "this username is free"
Return Nothing
End If
.....
End Function
End Class
그리고 프리젠 테이션 레이어에서
: 그 내용은 Dim userManager As New UserManager
Dim managerError As New UserManager.ErrorData
Dim userId As Guid
userId = userManager.CreateUserLogin("test", "test", managerError)
If userId = Nothing Then
If managerError.ErrorType = userManager.ErrorType.UserExists Then
Dim suggestedUserName = managerError.SuggestedUserName
' Do something with suggested user name
End If
End If
모두들 감사합니다. 내가 정확한 어딘가 반대편을 읽기 때문에 나는 "custom exception"경로를 사용했다. 필자는 다중 레이어 아키텍처가 준수한다고 생각하는 구성 요소 기반 시나리오에서 구성 요소가 "매직 넘버"또는 코드가 아니라 예외를 반환해서는 안된다는 것을 읽었습니다. 하지만 매번 사용자 지정 예외를 인스턴스화하고 사용자 지정 열거 형을 확인해야하므로이 코드는 사용자 지정 반환 코드를 처리하는 것과 매우 유사하지만 훨씬 비쌉니다. – Manight
나는 예외적 인 일이 생겼을 때 함수가 "매직 넘버"를 반환해서는 안된다는 것을 읽은 것으로 생각한다. 예를 들어, 성공했을 때 0을 반환하고 실패한 경우 -1을 반환하는 함수는 .NET에서 눈살을 찌푸리게됩니다. 이 경우 예외가 선호됩니다. 그러나 함수가 * 무언가를하고 * 결과가 여러 * 예상 * 것들 중 하나가 될 수 있다면 반환 코드가 적합합니다. – JDB