VBA 项目引用和共享状态(用于日志记录)



>假设我有 2 个加载项 A 和 B- 两者都使用共享加载项 C 中的 VB 函数(即AB引用了 VB 项目C)。

C会将一些消息记录到文件中(例如C.Log),当检测到错误时。我希望C日志在从 A 调用函数时A.log,在从B调用函数时B.log

C中使用日志文件名设置全局变量的幼稚方法是行不通的,因为该变量是单例,因此最后一个设置变量(AB)的项目将获胜。

如何在 VBA 中轻松完成此操作?

好的 - 所以这是我想出的解决方案(相当多的代码,但似乎工作正常):

我有一个日志记录项目,其日志记录接口ILog(实例化PublicNotCreatable),例如 这:

Public Sub Error(sLogMessage As String)
end sub
Public Sub Warning(sLogMessage As String)
end sub
' etc.

当然还有一个实现类CLog,它只是将消息写入日志文件.
和一个公共函数,以便调用者可以获得记录器的新实例:

Public Function New_Log(ByVal logFilePathAndName) As ILog
Set New_CLog = New CLog
New_CLog.Initialise logFilePathAndName
End Function

然后,项目 C必须将其所有代码都包含在一个类/或多个类中,这些类在初始化时获取ILog实例。例如CSharedClass可能如下所示:

Private Log as ILog ' note: the var is intentionally NOT called moLog
Public Sub Initialise(oLogger as ILog)
Set Log = oLogger
End Sub
' other functions in this class that want to log just use this:
Public Sub SomeProcedure()
Log.Error("error text")
End Sub

此外,此项目必须有一个公共函数才能让调用方创建实例,如下所示:

Public Sub New_SharedClass(oLogger as ILog) as CSharedClass ' NOTE: you may want to use an interface instead
Set New_SharedClass = New CSharedClass
New_SharedClass.Initialise oLogger
End Sub

然后项目 A 和 B可以使用这样的日志记录:

Private moLog as ILog
Public Function Log() as ILog
' log-file name is of course different for Proejct B
If moLog is Nothing then Set moLog = New_Log("ProjectA.log")
Set Log = moLog
End Function

项目 A/B 中的所有其他过程现在可以像这样写入日志消息(与共享项目中相同)

Log.Error("Error text")

当项目 A/B 想要使用共享项目时,它可以这样做

Private moSharedClass as CSharedClass 
Public Function SharedClass() as CSharedClass    
If moSharedClass is Nothing then Set moSharedClass = New_SharedClass(Log)
Set SharedClass = moSharedClass
End Function

现在,项目 A/B 中想要在共享类上调用 proc 的任何代码都可以简单地执行以下操作:

SharedClass.SomeProcedure()

SomeProcedure编写的日志消息最终将出现在正确的日志文件中

注意:我决定打破我自己的一些命名规则,以便所有项目都可以使用相同的代码进行日志记录(这样做的好处是我可以将过程从项目 A/B 移动到共享项目,反之亦然)

最新更新