Public Class LoginManager Implements ILoginManager Private ReadOnly _iLoginRepository As ILoginRepository Public Sub New() _iLoginRepository = New LoginRepository() End Sub Public Async Sub InsertFailedLoginAttempt(failedLoginAttempt As Fai
Public Class LoginManager Implements ILoginManager Private ReadOnly _iLoginRepository As ILoginRepository Public Sub New() _iLoginRepository = New LoginRepository() End Sub Public Async Sub InsertFailedLoginAttempt(failedLoginAttempt As FailedLogin) Implements ILoginManager.InsertFailedLoginAttempt 'Example of the S in Solid (Single Repsonsibilty) 'Need to call these method async. But await errors _iLoginRepository.InsertFailedLoginAttemptAsync(failedLoginAttempt) _iLoginRepository.InsertFailedLoginAttemptIntoLoginMasterAsync(failedLoginAttempt) End Sub End Class
Repsoitory接口:
Public Interface ILoginRepository Function IsUserAuthenticatedAsync(ByVal cID As String, ByVal password As String, ByVal IsExternalUser As Boolean) As Task(Of Boolean) Sub InsertFailedLoginAttemptAsync(ByVal failedLoginAttempt As FailedLogin) Sub InsertFailedLoginAttemptIntoLoginMasterAsync(ByVal failedLoginAttempt As FailedLogin) End Interface
存储库实现:
Public Class LoginRepository Implements ILoginRepository Public ReadOnly _applicationDBContext As New ApplicationDBContext() Public Async Sub InsertFailedLoginAttemptAsync(failedLoginAttempt As FailedLogin) Implements ILoginRepository.InsertFailedLoginAttemptAsync Using _applicationDBContext _applicationDBContext.RepFailedLogins.Add(failedLoginAttempt) Await _applicationDBContext.SaveChangesAsync() End Using End Sub Public Async Sub InsertFailedLoginAttemptIntoLoginMasterAsync(failedLoginAttempt As FailedLogin) Implements ILoginRepository.InsertFailedLoginAttemptIntoLoginMasterAsync Using _applicationDBContext _applicationDBContext.RepFailedLoginMasters.Add(failedLoginAttempt) Await _applicationDBContext.SaveChangesAsync() End Using End Sub ''' <summary> ''' Determine whether a user is authenticated, be it an internal or external user ''' I have condensed two methods into one ''' </summary> ''' <param name="cID"></param> ''' <param name="password"></param> ''' <param name="IsExternalUser"></param> ''' <returns></returns> Public Async Function IsUserAuthenticatedAsync(cID As String, password As String, IsExternalUser As Boolean) As Task(Of Boolean) Implements ILoginRepository.IsUserAuthenticatedAsync If (IsExternalUser And String.IsNullOrEmpty(password)) Then Throw New ArgumentNullException("External user requires password") End If Dim user As Chaser Dim toRet As Boolean Using _applicationDBContext 'Two ways to use LINQ 'First is LINQ Lambda sybntax(little harder to read) user = Await _applicationDBContext.Chasers.Where(Function(x) x.CID = cID).FirstOrDefaultAsync() 'Second is LINQ Query syntax(looks more like SQL just more verbose 'user = From x In _applicationDBContext.Chasers ' Where x.CID = cID ' Select x End Using If IsNothing(user) Then toRet = False ElseIf Not IsExternalUser And Not IsNothing(user) Then toRet = True ElseIf IsExternalUser And user.Hash_Password = password Then toRet = True End If Return toRet End Function End Class
我正在尝试在我的经理中调用InsertFailedLoginAttemptAsync存储库方法.它是一个异步方法,但我无法等待该方法.我怎样才能使这种方法等待?
我相信它与界面有关,而不是像C#那样使它成为异步方法,但我无法做到这一点.
Subs不应该是异步的.事件处理程序是该规则的唯一例外.您等待只能从函数返回的任务.如果目的是使该接口异步,那么所有成员都需要是返回Task或其派生的函数.Async在使用时会一直冒泡.这就是说ILoginManager和ILoginRepository应该重构(如果可能的话)以遵循正确的语法.
参考:Async/Await – Best Practices in Asynchronous Programming