当您从另一个对象或类调用共享子/函数时,如何创建或使用引发的事件?
我将展示一个例子: 我有访问数据库的DataHost类:
Class DataHost
Shared Sub addName().....
Shared Sub delName().....
Shared Function getNames()....
Shared Function askPassword()........
End Class
我希望程序每次调用DataHost的子/函数来访问数据库时都会询问密码。
我可以在每个函数的开头添加如果askpass()= False然后返回但在我的代码中函数超过20并且我希望有一个更智能的解决方案。
所以每当你调用另一个子/函数时,我正在寻找调用askPassword()的东西。
所有建议表示赞赏! :) 提前致谢
答案 0 :(得分:1)
好吧,这可能根本就不是您的要求,但我会发布共享事件的代码,然后您可以看看是否可以以任何方式使用它。 (这是我的日志事件所以忽略了命名)
Public Class Logging
Public Shared Event LogEvent As EventHandler
Public Shared Sub OnLogWrite(ByVal Sender As Object)
RaiseEvent LogEvent(Sender, New EventArgs)
End Sub
End Class
这是您必须收听的共享事件。您可以在任何位置向LogEvent添加处理程序。并且它将获取对此的所有调用。在这里,您将能够创建一个共享变量来跟踪发件人值。例如List(对象)。
您可以通过以下方式举办活动:
Logging.OnLogWrite(Me)
你可以随时随地收听活动:
AddHandler Logging.LogEvent, AddressOf HandleLogEvent
HandleLogEvent的代码如下所示:
Private Sub HandleLogEvent()
MessageBox.Show("Hello.")
End Sub
例如,可以将HandleLogEvent重命名为askPassword。这意味着如果没有在OnLogWrite Sub中进行检查。然后,只要调用该事件,就会执行askPassword。希望这能以某种方式帮助你。
答案 1 :(得分:0)
我建议不要对所有函数使用共享方法,只允许通过实例调用它们。然后限制实例化(构造函数)进程。快速样本:
Class DataHost
Shared Function GetHost() As DataHost
If askPassword() Then
Return New DataHost()
End If
' Or do something else instead of throw nothing
Return Nothing
End Function
Shared Function askPassword() As Boolean
' ask for password?
End Function
''' <summary>
''' Private constructor to avoid external instantiation - thus force external calls to go through factory: GetHost()
''' </summary>
''' <remarks></remarks>
Private Sub New()
End Sub
Sub addName()
End Sub
Sub delName()
End Sub
Function getNames() As IEnumerable(Of String)
End Function
End Class
这里你可以看到调用GetNames(),调用者必须有一个DataHost的实例,但是,由于私有构造函数,调用者必须通过工厂方法GetHost()获取DataHost的实例。
如果您不想拥有许多DataHost副本,您也可以使用单例,并在提供密码时在GetHost()方法中将其返回。
编辑: 如果你真的想要在这个过程中引发一个事件,你也可以在GetHost方法中这样做: 在DataHost中创建一个私有方法来引发一个事件,然后在实例化DataHost之后,调用它来抛出事件:
Shared Function GetHost() As DataHost
If askPassword() Then
dim host = New DataHost()
host.RaiseSomeEvent()
End If
' Or do something else instead of throw nothing
Return Nothing
End Function
然后在外部可以订阅和处理事件。