我有一个申请。
模块1 - 主要应用程序
DataAccessMananger - 主应用程序中用于处理数据的类
配置 - 处理配置设置的其他项目(常见dll)中的类。
问题/疑问。 Configuration类如何处理DataAccessMananger中的数据更改事件,而不知道DataAccessManager是什么,因为它们位于不同的类中?
我能想到使其工作的唯一方法是让模块1处理来自DataAccessMananger的事件并让它调用Configuration类中的方法,但是我不喜欢这样,我宁愿Configuration能够处理它自己的数据更新...
清除泥土?有任何想法吗? VB.NET 4.5,我对代表有一点了解,但不知道我怎么能在这里使用它们,它们必须是答案的一些方法......
理想情况下,我希望能够通过"事件"使用模块...从DAM类到配置类...
答案 0 :(得分:1)
我能想到的最好的方法是在配置类(common.dll)中添加一个由DataAccessMananger实现的接口。我假设mainmodule知道DataAccessMananger和Configuration,对吧?如果是这样,以下可能是一个解决方案。
为common类添加一个接口,供Configuration类使用(不实现)包含要管理的事件。例如:
Public Interface IConfiguration
Event ConfigChanged(sender As Object, e As configPropertyChanged)
End Interface
就我而言,我还创建了一个继承Event args的类。
Public class configPropertyChanged
Inherits EventArgs
Public Property PropertyName() As string
Public Property NewValue() As String
Public Property OldValue() As String
Public sub New(Newvalue as string,OldValue as string,<CallerMemberName()> optional PropertyName as string = "")
Me.NewValue = Newvalue
Me.OldValue =OldValue
Me.PropertyName = PropertyName
End sub
End Class
然后修改配置类以便能够监视任何类(这意味着在主模块中,必须使配置知道DataAccessManager类(通知Idisposable实现为清理)。
Public Class Configuration
Implements IDisposable
Private _ConfigList As New List(Of IConfiguration)
Public Sub RegisterConfig(Config As IConfiguration)
_ConfigList.Add(Config)
AddHandler Config.ConfigChanged, AddressOf ConfigChanged
End Sub
Public Sub ConfigChanged(sender As Object, e As configPropertyChanged)
Console.WriteLine("Config has changed.")
End Sub
#Region "IDisposable Support"
Private disposedValue As Boolean ' To detect redundant calls
Public Sub Dispose() Implements IDisposable.Dispose
For Each config As IConfiguration In _ConfigList
RemoveHandler config.ConfigChanged, AddressOf ConfigChanged
Next
_ConfigList.clear()
End Sub
#End Region
End Class
DataAccessManager确实实现了Iconfiguration接口(可从common.dll获得)
Public Class DataAccessMananger
Implements IConfiguration
Public Event ConfigChanged(sender As Object, e As configPropertyChanged) Implements IConfiguration.ConfigChanged
Private _Name As String
Public Property Name() As String
Get
Return _Name
End Get
Set(value As String)
If String.Compare(_Name, value, True) <> 0 Then
RaiseEvent ConfigChanged(Me, New configPropertyChanged(Value,_Name))
_Name = value
End If
End Set
End Property
End Class
最后,主模块是唯一知道Configuration和DataAccessManager存在的模块,它将DataAccessManager注册到配置中。
Public Sub Main()
Dim MyManager As New DataAccessMananger
Dim MyConfig As New Configuration
MyConfig.RegisterConfig(MyManager)
MyManager.Name = "New name"
End Sub
在这种情况下。 主模块在某个时刻加载配置和数据访问管理器,然后将数据访问管理器注册到配置对象中。它还可以注册实现Iconfiguration过程的任何其他类。
在某些时候,某些事情会触发一个引发事件进入数据访问管理器(在我的示例中,更改属性名称就是这样)。数据访问管理器引发事件,配置对象处理它,因为我们将数据类注册到配置对象中。
如果你愿意,你可以完全跳过界面,只需让DataAccessManager向主模块引发一个事件,然后在主模块事件处理程序中,从配置类中调用一个公共方法。