여기 게시자/구독자를 잘 구현해야한다고 생각합니다.
게시자
:
EventAggregator
같은 방법이 있어야합니다,이 인터페이스를 구현해야합니다
당신의
IEventObserver
public void Register(IEventObserver observer, EventFilter filter)
public void Unregister(IEventObserver observer)
이
public interface IEventObserver
{
void Notify(object eventSource, DetailedEventArgs e);
}
가입자과 같아야합니다 나의 제안은 다음과 같이한다.
EventFilter
클래스에는 사용하려는 모든 필터링 속성이 있어야합니다. 이 클래스는이 같은 방법을 가질 수 있습니다
public bool IsSatisfiedBy(DetailedEventArgs e)
및 DetailedEventArgs
라는 클래스를 생성하고 EventArgs
에서 상속, 그에서 이벤트에 대해 당신이 원하는 모든 세부 사항을 넣어.
Register
방법의 경우 필터와 옵저버를 모두 저장해야합니다. 이제 EventAggregator
이 이벤트를 포착 할 때받은 이벤트에서 DetailedEventArgs
개체를 만든 다음 관찰자와 해당 필터를 반복하여 개체가 필터를 만족하는지 확인하고 그렇지 않은 경우 관찰자의 Notify 메서드를 호출해야합니다. 원래 발신자와 DetailedEventArgs
개체입니다.
구독자 측이 아닌 게시자 측에서 필터를 확인하는 것이 좋습니다. 구독자 측에서 확인하면 코드가 중복되고 불일치하게됩니다.
편집 : 예 EventFilter
및 DetailedEventArgs
클래스 :
public class EventFilter
{
private List<Type> SourceTypes;
private List<EventType> EventTypes;
public EventFilter() : this(new Type[] { }, new EventType[] { }) { }
public EventFilter(IEnumerable<Type> sourceTypes, IEnumerable<EventType> eventTypes)
{
SourceTypes = new List<Type>(sourceTypes);
EventTypes = new List<EventType>(eventTypes);
}
public void AddSourceType(Type type)
{
AddItemToList(SourceTypes, type);
}
public void AddEventType(EventType type)
{
AddItemToList(EventTypes, type);
}
private void AddItemToList<T>(List<T> list, T item)
{
lock (list)
{
if (!list.Contains(item))
list.Add(item);
}
}
public bool IsSatisfiedBy(DetailedEventArgs args)
{
return SourceTypes.Contains(args.Source.GetType()) && EventTypes.Contains(args.EventType);
}
}
public class DetailedEventArgs : EventArgs
{
public EventArgs SourceArgs { get; private set; }
public object Source { get; private set; }
public EventType EventType { get; private set; }
public DetailedEventArgs(object source, EventArgs sourceArgs, EventType eventType)
{
Source = source;
SourceArgs = sourceArgs;
EventType = eventType;
}
}
public enum EventType
{
EventType1,
EventType2,
EventType3
}
희망은 내가 :)
이 EventFilter가 어떤 구조로되어 있어야하는지 (그리고 어떤 정보가 저장 될 것인가) 확실하지 않습니다 .. 분명히 보이려면 어떻게 보이는지 보여 줄 수 있습니까? – developer
답을 수정하고 예제를 추가했습니다. 예제에서,'EventFilter' 클래스는 소스의'Type'과 함께 작동하지만 원할 경우, 소스 인스턴스를 확인하기 위해 객체로 변경할 수 있습니다. –