VB.NET在一个类中处理另一个类中的事件,而它们彼此不知道。。。?

VB.NET在一个类中处理另一个类中的事件,而它们彼此不知道。。。?,vb.net,events,Vb.net,Events,我有一份申请 模块1-主要应用程序 DataAccessMananger—主应用程序中用于处理数据的类 配置-处理配置设置的不同项目(公共dll)中的类 这个问题。配置类如何处理DataAccessManager中的数据更改事件,而不知道DataAccessManager是什么,因为它们位于不同的类中 我能想到的唯一方法是让模块1处理来自DataAccessManager的事件,并让它在配置类中调用一个方法,但是我不喜欢这样,我希望配置能够处理它自己的数据更新 清澈如泥?有什么想法吗?VB.NE

我有一份申请

模块1-主要应用程序

DataAccessMananger—主应用程序中用于处理数据的类

配置-处理配置设置的不同项目(公共dll)中的类

这个问题。配置类如何处理DataAccessManager中的数据更改事件,而不知道DataAccessManager是什么,因为它们位于不同的类中

我能想到的唯一方法是让模块1处理来自DataAccessManager的事件,并让它在配置类中调用一个方法,但是我不喜欢这样,我希望配置能够处理它自己的数据更新

清澈如泥?有什么想法吗?VB.NET 4.5,我知道一些关于代理的知识,但不确定如何在这里使用它们,它们一定是一些如何


理想情况下,我希望能够使用模块将“事件”从DAM类传递到config类…

我能想到的最佳方法是在配置类(common.dll)中添加一个接口,该接口将由DataAccessManager实现。我假设主模块同时知道DataAccessManager和配置,对吗?如果是这样,下面可能是一个解决方案

  • 将包含要管理的事件的要使用(非实现)的配置类的接口添加到common.dll。例如:

    Public Interface IConfiguration
        Event ConfigChanged(sender As Object, e As configPropertyChanged)
    End Interface
    
    在本例中,我还创建了一个继承事件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实现Iconfiguration接口(可从common.dll获得)

  • 在这种情况下。 主模块在某个点加载配置和数据访问管理器,然后将数据访问管理器注册到配置对象中。它还可以注册实现Iconfiguration过程的任何其他类

    在某个时刻,某个事件会触发一个raise事件进入数据访问管理器(在我的示例中,更改属性名称就是这样做的)。数据访问管理器将引发事件,配置对象将处理该事件,因为我们将数据类注册到配置对象中


    如果您愿意,您可以完全跳过接口,让DataAccessManager向主模块引发一个事件,然后在主模块事件处理程序中,从配置类调用一个公共方法。

    请检查此项。当object1处理object2的事件时,从技术上提高内容质量将非常有用,实际发生的情况是,创建了一个引用object1中的方法的委托,该委托被传递给object2,后者将其存储在集合中。Object2引发事件实际上包括它遍历委托集合并调用每个委托。所以,你的两个类很可能互不了解,其中一个仍然处理另一个的事件,只要有其他类型知道这两个类,并且能够创建和传递委托。我很确定,除非你可以修改和编译Common.dll的新版本,否则你不能这样做。从那里,您可以创建允许动态添加事件侦听器的方法。恐怕您的模块无法订阅事件并调用Config类中的方法。
    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
    
    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
    
    Public Sub Main()
    
       Dim MyManager As New DataAccessMananger
       Dim MyConfig As New Configuration
       MyConfig.RegisterConfig(MyManager)
       MyManager.Name = "New name"
    End Sub