Prism - EventAggregator.GetEvent‹›.Subscribe() - Използване на общи и ограничения

Имам проблем с абонирането за събития с агрегатора на събития, който идва като част от рамката на призмата.

Ако използвам нещо като

eventAggregator.GetEvent<string>().Subscribe(MyMethod)

тогава всичко работи добре, моят метод се задейства, когато дадено събитие е публикувано.

Въпреки това, когато преминавам към по-сложен обект, различен от I string, срещам проблеми.

Имам куп класове, които всички произтичат от интерфейс (IRequest) например

Имам настройка на класа на събитието, както следва

public class MyEvent<TRequest> : PubSubEvent<MyClass<TRequest>> where TRequest : IRequest {}

Имам общ клас (MyClass), който използва обект на IRequest вътре в него - отново, всичко изглежда работи добре на този етап.

Сега, да кажем, че публикувам събитие на MyClass, което използва обекта Profile вътре в него:

eventAggregator.GetEvent<MyEvent<Profile>>().Publish(myProfileObject);

В моя абонамент бих искал метод, който може да улови всички събития на MyEvent - Без значение дали T е Profile или някакъв друг обект, който произлиза от IRequest - това е мястото, където изглежда имам проблеми.

В следващите примери първото работи, но второто не работи - в идеалния случай бих искал да използвам нещо подобно на второто.

eventAggregator.GetEvent<MyEvent<Profile>>().Subscribe(test1);
void test1 (MyClass<Profile> obj)
{
  //Some stuff here
}

eventAggregator.GetEvent<MyEvent<IRequest>>().Subscribe(test2);
void test2<T>(MyClass<T> obj) where T : IRequest
{
  //never gets called
}

Моето предположение е, че тъй като Profile произлиза от IRequest, тогава трябва да работи??? Но не става!!

Всяка помощ ще бъде оценена.

АКТУАЛИЗАЦИЯ
Ако използвам следното, то работи, но ще изисква от мен да създам отделен абонамент за всеки наличен тип IRequest - търся да имам само един абонамент.

eventAggregator.GetEvent<MyEvent<Profile>>().Subscribe(test2);
eventAggregator.GetEvent<MyEvent<User>>().Subscribe(test2);

person David Hamilton    schedule 08.10.2015    source източник
comment
Хей. Мисля, че въпросът ви показва усилие, но бихте могли да мотивирате мързеливи хора като мен, като подготвите пълна проба за копиране и поставяне на съкратена проба + използвани препратки към nuget. Понякога, докато го подготвяте, ще намерите и източника защо не работи (поне аз го направих вече няколко пъти)   -  person Dbl    schedule 08.10.2015
comment
@AndreasMüller - Благодаря, ще се опитам да добавя допълнителни връзки/препратки и т.н. в бъдеще - въпреки че в този случай кодът, който използвам, е много по-сложен, така че се опитвах да дам съответната информация, като същевременно опростих всичко   -  person David Hamilton    schedule 09.10.2015


Отговори (1)


MyEvent<IRequest> и MyEvent<Profile> не са еднакви, така че EventAggregator не вижда това като едно и също събитие. За да позволите ковариантни типове, можете да го коригирате с модификатора out в C# 4. Нещо подобно трябва да работи:

public interface IMyClass<out T> where T : IRequest { }

public class MyClass<T> : IMyClass<T> where T : IRequest { }

public class MyEvent<TValue> : PubSubEvent<IMyClass<TValue>> where TValue : IRequest { }

Тогава вашият агрегатор на събития ще изглежда така:

 _eventAggregator.GetEvent<MyEvent<IRequest>>().Subscribe(Received);

 private void Received(IMyClass<IRequest> obj)
 {

 }

_eventAggregator.GetEvent<MyEvent<IRequest>>().Publish(new MyClass<Profile>());

това помага ли

person Community    schedule 08.10.2015