2017-09-26 2 views
-1

양식의 삽입 된 데이터의 유효성을 검사하는 함수가 있는데이 함수에서 사용자로부터 일부 확인을 요청해야하며이 확인은 함수 외부에서 요청해야합니다. 나는이 확인 중 하나를 명중하고, 나는 메시지를 창조하고, 사용자 확인 또는 아닙니다 기능을 보낸다. 기능은 다시 불릴 것이다함수의 체크 포인트 VB.NET

그래서 여기에서 문제는이다 : 나는 나의 기능에있는 몇몇 검문소를 두어야한다 그래서 유효성 검사 함수를 호출합니다. 사용자가 선택한 확인을 사용하여 해당 검사 점으로 건너 뛰고 해당 검사 점에서 유효성 검사 함수를 실행합니다.

1 : 이것은 모두 가능합니까?

2 : 이것을 수행하기위한 아이디어는 무엇입니까?

편집 1 : 비즈니스 계층에서이 유효성 검사를 수행하고 거기에서 메시지 상자를 표시 할 수 없습니다. 메시지를 만들어 UI 레이어로 반환하면 사용자 및 함수 호출에서 다시 응답합니다. 나는이 객관적 대답은 아니지만 도움이 될 수

Public Class BL 
    Private Queue As Queue(Of String) 
    Public Sub New() 
     Dim checkpoints = New String(){"CheckPoint1","CheckPoint2","CheckPoint3"} 
     checkpoints.ToList.ForEach(Function(item) <b>Queue.Enqueue(item)</b>) 
    End Sub 

    Public Function Func(ByVal res As Response,ParamArray ByVal params As String()) As Response 
     Dim response As Response 
     Dim chk = Queue.Dequeue() 
     GoTo chk 
     CheckPoint1: 
     'Do some stuff 
     response = New Response(Response.ResponseType.Message,"Are you sure you wanna do this?") 
     Return response 
     CheckPoint2: 
     If(res.Type = Response.ResponseType.ResponseBack) 
      Dim r As DialogResult = Convert.ChangeType([Enum].Parse(GetType(DialogResult),res.Message),GetType(DialogResult)) 
      If (r= DialogResult.OK) 
      'Do stuffs on DialogResult.Yes 
       Else 
      'Do stuffs on DialogResult.No 
      End If 
      'Do other stuffs with database 
     End If 
     ' Do other stuff 
     response = New Response(Response.ResponseType.Message,"You should do this!!OK?") 
     Return response 
     CheckPoint3: 
     'Do stuff like CheckPoint1 

    End Function 
End Class 
Public Class Response 
    Friend Enum ResponseType 
     Message 
     Result 
     ResponseBack 
     None 
    End Enum 
    Friend Message As String 
    Friend Type As ResponseType 
    Friend Sub New(ByVal type As ResponseType,msg As String) 
     Message=msg 
     Type= type 
    End Sub 
    End Class 

Public Class Form1 
    Public Sub New() 
     ' This call is required by the designer. 
     InitializeComponent() 
     Dim BL As New BL() 
     ' Add any initialization after the InitializeComponent() call. 
     Dim rese As Response 
     Do 
      rese =BL.Func(Nothing) 
      BL.Func(new Response(Response.ResponseType.ResponseBack,if(MessageBox.Show(rese.Message).ToString()))) 
     Loop Until rese.Type <> Response.ResponseType.Result 
     MessageBox.Show(if(rese.Message="True","OK","ERROR")) 
    End Sub 
End Class 
+0

@ParrishHusband 함수에서 돌아와서 물건을 다시 호출해야하는데, while 루프를 사용하면 어떻게 할 수 있습니까? – AliTheOne

+0

질문을 조금 다르게 읽었으므로 처음의 While 루프 주석을 무시합니다. 유효성 검사와 함수가 수행해야하는 작업에 대해보다 구체적으로 설명 할 수 있습니까? –

+0

@ParrishHusband 방금 내 질문을 편집했습니다 !! – AliTheOne

답변

0

이 당신을 위해 작동합니다 :

Public Class BL 

    Private Queue As Queue(Of String) 

    Private _checkpoints As Dictionary(Of String, Func(Of Response, Response)) = New Dictionary(Of String, Func(Of Response, Response)) From 
    { 
     { "CheckPoint1", Function (res) New Response(Response.ResponseType.Message, "Are you sure you wanna do this?") }, 
     { "CheckPoint2", Function (res) 
       If (res.Type = Response.ResponseType.ResponseBack) 
        Dim r As DialogResult = CType(Convert.ChangeType([Enum].Parse(GetType(DialogResult), res.Message), GetType(DialogResult)), DialogResult) 
        If (r = DialogResult.OK) 
         'Do stuffs on DialogResult.Yes 
        Else 
         'Do stuffs on DialogResult.No 
        End If 
        'Do other stuffs with database 
       End If 
       ' Do other stuff 
       Return New Response(Response.ResponseType.Message, "You should do this!!OK?") 
      End Function 
     }, 
     { "CheckPoint3", Function (r) New Response(Response.ResponseType.Message, "Are you sure you wanna do this?") } 
    } 

    Public Sub New() 
     _checkpoints.ToList().ForEach(Sub(item) Queue.Enqueue(item.Key)) 
    End Sub 

    Public Function Func(ByVal res As Response, ParamArray ByVal params As String()) As Response 
     Dim chk = Queue.Dequeue() 
     Return _checkpoints(chk).Invoke(res) 
    End Function 
End Class 

기본적으로이 원하는 Response을 반환하는 Func(Of Response, Response)String 매핑하는 Dictionary(Of String, Func(Of Response, Response))을 만듭니다.

당신에게 더 잘 어울리는 몇 가지 변형이 있지만 아마도 이것이 당신에게 도움이되는지 아닌지 알려주고 필요할 경우 다른 옵션을 제안 할 수 있습니다.

+0

감사합니다. 작동 여부를 알려 드리겠습니다. – AliTheOne

+0

@AliTheOne - 정상적으로 작동합니다. 귀하의 질문에 정확히 일치하는 코드입니다. – Enigmativity

+0

_checkpoints에서 params를 사용하려면 어떻게해야합니까? – AliTheOne

1

된 부분 만이 대답에 나는 처음부터 기능을 실행에서 실행해야하고 싶지 않아요. 질문과 답변이 포함 된 일종의 수업이 필요합니다. 유효성 검사 클래스는 질문 목록을 반환합니다 (확실합니까?).

Class ValidationOutput 
    ValidationId 
    Message 
    Result 
End Class 

유효성 검사 함수를 호출 한 후 사용자로부터 추가 정보가 필요한 유효성 검사 목록을 얻습니다. 이는 유효성 검증 기능 외부에서 처리 될 수 있습니다. 추가 정보를 얻으면 유효성 검사를 다시 호출하고 동일한 목록을 매개 변수로 전달하십시오. 유효성을 검사 할 때 목록에서 필요한 추가 정보가 모두 있는지 확인하십시오.

1

저는 비즈니스 로직이 사용자 상호 작용을 다루어서 두 부분으로 나뉘어서는 안된다고 생각합니다.

그러나이 방법을 선호하는 경우 콜백을 사용할 수 있습니다. 유효성 검증/비즈니스 메소드에 대한 위임 매개 변수를 정의하고 확인이 필요할 때 해당 위임자를 호출하십시오. 반환 값에 따라 작업 저장 여부를 계속합니다.

아래 링크를 통해 대리인이 메서드에 전달할 수 있는지 확인할 수 있습니다.

https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/delegates/how-to-pass-procedures-to-another-procedure

+0

좋아요. 시간 내 주셔서 감사합니다. – AliTheOne