2013-07-08 1 views
2

VB.Net의 다중 프로젝트 솔루션에서 전역 이벤트를 발생시키는 것이 가능합니까? 예를 들어 프로젝트 1에는 Form1이라는 양식이 있습니다. Form1에는 클릭하면 이벤트가 발생하고 project2는 해당 이벤트를 처리 할 수 ​​있으며 심지어 project3도 해당 이벤트를 처리 할 수있는 버튼이 있습니다.VB.Net 다중 프로젝트 솔루션의 이벤트

+0

왜 다른 프로젝트에서 이벤트를 처리해야합니까? 당신은 Form1에서 이벤트를 처리 할 수 ​​없으며 Form1이 project2, project3 등에서 필요한 코드를 호출하도록 할 수 있습니까? –

+0

@Douglas prject1을 모두 참조해야하며 Visual Studio에서 순환 참조 오류가 발생하기 때문에 project1과 project2를 참조 할 수 없습니다. 이벤트를 일으키고 다른 프로젝트가 응답 할 수있게하려면 project1이 필요합니다. 그렇지 않으면 프로젝트간에 더 쉽게 상호 작용할 수 있기를 바랍니다. – TheRyan722

+0

Eons 전에 .NET Remoting을 통해이 문제를 해결할 수있었습니다. 그렇지만이 방법을 사용하는 것이 좋지는 않을 것입니다. WCF 솔루션이 필요에 따라 여기에서 작동 할 수 있습니다. – gws2

답변

0

"글로벌 이벤트"를 유일한 목적으로하는 클래스가있는 전용 프로젝트를 가질 수 있습니다. 해당 클래스가 모든 프로젝트가 동일한 인스턴스에 액세스 할 수 있도록 싱글 톤 패턴을 구현하도록하십시오. 다른 모든 프로젝트는이 프로젝트를 참조 할 수 있으며 다음과 같이 수 : 여기

' This is in Project3 
Public Class Class1 

    Private Sub New() 
    End Sub 

    Private Shared _Instance As Class1 

    Public Event GlobalEvent() 

    Public Shared ReadOnly Property Instance As Class1 
     Get 
      If IsNothing(_Instance) Then 
       _Instance = New Class1 
      End If 
      Return _Instance 
     End Get 
    End Property 

    Public Sub RingTheBell() 
     RaiseEvent GlobalEvent() 
    End Sub 

End Class 

는 견적입니다 Project1의에서, Project2에있는 FormB을 (Project1의이 Project2에와 프로젝트 3 모두에 참조가) 표시. 우리는 싱글 인스턴스를 잡고 "글로벌 이벤트"마련하기 위해 RingTheBell() 메소드를 호출

' This is in Project1 
Public Class FormA 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     Dim frmB As New Project2.FormB 
     frmB.Show() 
    End Sub 

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click 
     Project3.Class1.Instance.RingTheBell() 
    End Sub 

End Class 

마지막으로, 이상 Project2에, 우리는 또한 싱글 인스턴스를 잡고 그 GlobalEvent에 가입을 (를 Project2 만 참조가) 프로젝트 3에 : 그래서 "글로벌 이벤트"에 가입하고자하는 모든 프로젝트는 단순히 프로젝트 3에 대한 참조를 추가하고 프로젝트를 구독 할 수 있습니다 할 수있는 싱글 인스턴스를 반환하는 인스턴스() 메서드를 사용하여

' This is in Project2 
Public Class FormB 

    Private WithEvents x As Project3.Class1 = Project3.Class1.Instance 

    Private Sub x_GlobalEvent() Handles x.GlobalEvent 
     MessageBox.Show("GlobalEvent() trapped in Project2") 
    End Sub 

End Class 

로 이벤트.

0

이것은 가능한 여러 경로를 통해 가능합니다. 이 경우 의존성 주입을 선호합니다.

먼저 글로벌 이벤트 소유자 프로젝트를 만듭니다. 나는 GlobalEventSample이라는 이름을 지었다. 기본 네임 스페이스를 제거하고 명시 적으로 코드 구조를보다 분명하게 선언했습니다.

Namespace GlobalEventSample 

    Public Module Module1 

     Public Event GlobalEvent As EventHandler 

     Public Sub Main() 

      Console.WriteLine("Press any key to raise event...") 
      Console.ReadKey(True) 

      RaiseEvent GlobalEvent(Nothing, EventArgs.Empty) 

      Console.WriteLine("Press any key to quit...") 
      Console.ReadKey(True) 

     End Sub 

    End Module 

End Namespace 

이제 소비자 프로젝트를 만듭니다. 나는 GlobalEngineConsumer라고 명명했다. 나는 기본 네임 스페이스를 제거하고 명시 적으로 (마찬가지로 위) 여기 선언 : 나는 "IGlobalEventOwner"라는 인터페이스를 선언 한

Namespace GlobalEventConsumer 

    Public Interface IGlobalEventOwner 

     Event GlobalEvent As EventHandler 

    End Interface 

    Public Class Class1 

     Public Sub New(ByVal globalEvent As IGlobalEventOwner) 
      AddHandler globalEvent.GlobalEvent, AddressOf GlobalEventHandler 
     End Sub 

     Public Shared Sub GlobalEventHandler(ByVal sender As Object, ByVal e As EventArgs) 
      Console.WriteLine("Event Handled!") 
     End Sub 

    End Class 

End Namespace 

공지 사항. 이벤트가있는 객체를 정의하는 것뿐입니다. 이 이벤트에는 처리하려는 전역 이벤트와 동일한 시그니처가 있습니다.

예제 프로젝트로 돌아가서 소비자 프로젝트에 대한 참조를 만듭니다.

소비자 프로젝트에는 IGlobalEventOwner를 구현하는 개체가 필요합니다. 모듈은 인터페이스를 구현할 수 없으므로 대신 모듈의 이벤트를 처리 한 다음 자체 이벤트를 실행하는 개인 클래스 인 GlobalEventRouter를 만듭니다. 마지막으로 Main 서브 클래스에 클래스 1의 새 인스턴스를 만들고 GlobalEventRouter 클래스의 인스턴스를 전달합니다.

Namespace GlobalEventSample 

    Public Module Module1 

     Public Event GlobalEvent As EventHandler 

     Public Sub Main() 

      Dim consumer As New GlobalEventConsumer.Class1(New GlobalEventRouter()) 

      Console.WriteLine("Press any key to raise event...") 
      Console.ReadKey(True) 

      RaiseEvent GlobalEvent(Nothing, EventArgs.Empty) 

      Console.WriteLine("Press any key to quit...") 
      Console.ReadKey(True) 

     End Sub 

     Private Class GlobalEventRouter 
      Implements GlobalEventConsumer.IGlobalEventOwner 

      Public Event GlobalEvent(ByVal sender As Object, ByVal e As System.EventArgs) Implements GlobalEventConsumer.IGlobalEventOwner.GlobalEvent 

      Public Sub New() 
       AddHandler Module1.GlobalEvent, AddressOf GlobalEventHandler 
      End Sub 

      Private Sub GlobalEventHandler(ByVal sender As Object, ByVal e As EventArgs) 
       RaiseEvent GlobalEvent(sender, e) 
      End Sub 

     End Class 

    End Module 

End Namespace 

출력 :

아무 키나 눌러 이벤트 인상 ...
이벤트는 취급!
아무 키나 눌러 종료하십시오.

관련 문제