문제

프리즘으로 이벤트 집계를 구현하기 위해 노력하고 있습니다. 몇 가지 모듈이 있으며, 각 모듈이 요청 될 때 알려주는 이벤트를 구독하기를 원합니다. 나는 Shell의 구독 및 출판사와 함께 모든 일반적인 예를 시작했습니다. 거기에 문제가 없습니다. 지금; 가입자를 내 모듈로 옮기면 트리거되지 않습니다. 더 이상한 점은 실제로 몇 번이나 작동했다는 것입니다. 그래서 나는 인종 조건 인 것 같지만 그 이유를 이해하지 못합니다.

가정 : IEVENTAGGREGATOR를 설정할 필요가 없습니다. 예를 들어 IOC 컨테이너에 등록하십시오. 이것은 프리즘에 내장되어있어 이벤트 애그리 게이터의 인스턴스가 하나뿐입니다.

따라서 질문은 기본적으로 구독자를 설정 해야하는 방법/시기입니다. 물건 등에 대한 특정 순서가 있습니까? 단순화 된 예에는 하나의 모듈 myModule이 있습니다. Bootstrapper는 카탈로그에 MyModule을 추가합니다. 초기화합니다.

catalog.AddModule(typeof(MyModule));

MyModule은 Aggregator를 저장하고 MyModuleRequestedEvent를 구독하는 데 사용합니다. 또한 메뉴 레지스트리를 사용하여 응용 프로그램 메뉴에 등록합니다. 아이디어는 결국 메뉴를 클릭하면 이벤트를 트리거해야합니다. 그런 다음 무엇을 해야하는지 알아내는 데 MyModule의 책임이되기를 원합니다.

public MyModule(IEventAggregator aggregator, IApplicationMenuRegistry menu)
{
    _applicationMenu = menu;
    _aggregator = aggregator;
}

public void Initialize()
{
    var evnt = _aggregator.GetEvent<MyModuleRequestedEvent>();
    evnt.Subscribe(MyModuleRequested);
    _applicationMenu.RegisterMenuItem("MyModule", evnt);
}

public void MyModuleRequested(bool b)
{
    MessageBox.Show("MyModule requested");
}

이제이 이벤트를 게시 할 쉘에 버튼이 있습니다. 해결 될 때 쉘이 동일하게 (?) 이벤트 애그리 게이터를 얻습니다.

public Shell(IEventAggregator aggregator)
{
    InitializeComponent();
    var evnt = aggregator.GetEvent<MyModuleRequestedEvent>();
    EventTriggerButton.Click += (s, e) => evnt.Publish(true);
}

메모:

  • 이벤트가 게시되었는지 확인했습니다. 쉘에 가입자를 추가하면이 가입자가 이벤트를 받게됩니다.
  • 다시; MyModule의 가입자는 트리거되지 않습니다. 그러나 이상하게도 몇 차례에 걸쳐있었습니다.
  • 나는 이벤트에 입력을 사용하지 않습니다. 입력 유형이 필요한 것처럼 보였으므로 방금 더미 부와 함께갔습니다. 이것을 제거 할 수 있습니까 ..?
도움이 되었습니까?

해결책

Prism Event Aggregator는 약한 참조를 사용하여 이벤트에 대한 링크를 사용합니다. 이것은 이벤트 처리기의 메모리 누출을 방지하기위한 것입니다.

모듈 초기화기가 실행되면 이벤트가 발사되기 전에 이벤트 핸들러가 파괴됩니다. 과부하의 구독을 사용하여 이벤트 핸들러를 유지하도록 프리즘에 알릴 수 있습니다.

evnt.Subscribe(MyModuleRequested, true);

패턴으로, 나는 모든 이벤트 가입자를 별도의 클래스에 넣고 모듈에서 해당 클래스를 호출하는 경향이 있습니다. 그렇게하면 이벤트는 살아 있지만 모듈이 여전히 파괴되는 동안 분리되어 있습니다.

다른 팁

그래서 방금 이론을 얻었지만 지금 당장 테스트 할 시간이 없습니다. 내일 할 것입니다.

질문 : 모듈러스 카탈로그에 모듈을 추가하면 살아 남을까요? 나는 그것을 가정했다. 따라서 - MyModule은 살아 있어야합니다. 그리고 이벤트가 게시되면 트리거됩니다.

protected override IModuleCatalog GetModuleCatalog()
{
    var catalog = new ModuleCatalog();
    catalog.AddModule(typeof(MyModule));
    return catalog;
}

그러나 이것이 모듈을 유지하지 않으면 이벤트에 어려움을 겪을 것이라는 것이 분명합니다. 모듈 - 객체는 죽지 만 구독을 취소하지 않으므로 EventAggregator 목록에 가입자가 표시되지만 가입자는 더 이상 주변에 없습니다. 또한; 나는 그것이 실제로 가끔 작동한다고 언급했다. 이벤트 수집가가 이벤트가 트리거되기 전에 쓰레기를 꺼낼 시간이 없다면 그렇습니다.

이것은 사건처럼 들립니까? 그렇다면 - 아직 솔루션을 생각하지 않았으므로 다른 답장에서 제안 할 수 있습니다.

그래서; 어쨌든 모듈레코탈로 게는 무엇입니까? 초기화를위한 목록만이 버렸습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top