2011-12-05 2 views
0

내 응용 프로그램에 대한 이벤트 수집기를 설계하려고합니다. (나는 디자인 패턴에 익숙하지 않아서 아직 완전히 이해하지 못하고있다.)이벤트 수집기 : 솔루션 수정 도움이 필요합니다.

첫째, 이미 수집기가 다소 있지만 더 나은 효율성과 종속성을 줄이기 위해 개선 및 리팩토링이 필요한 솔루션을 만들었습니다.

1) Event Aggregator 디자인 패턴에서 .NET 데이터 소스가 게시자로 간주됩니까? (퍼블리셔의 역할이 확실치 않다).

2) 특정 데이터 소스뿐만 아니라 특정 데이터 이벤트에 대해서도 구독을 처리하도록 솔루션을 설계하려면 어떻게해야합니까? 나는 목록을 유지하고 지치지 않고 반복하면서 해결할 솔루션을보고 싶습니다.하지만이 모든 것을 함께 피할 수 있는지 확실하지 않습니다.

답변

1

여기 게시자/구독자를 잘 구현해야한다고 생각합니다.

게시자

: 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 개체입니다.

구독자 측이 아닌 게시자 측에서 필터를 확인하는 것이 좋습니다. 구독자 측에서 확인하면 코드가 중복되고 불일치하게됩니다.

편집 : 예 EventFilterDetailedEventArgs 클래스 :

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 
} 

희망은 내가 :)

+0

이 EventFilter가 어떤 구조로되어 있어야하는지 (그리고 어떤 정보가 저장 될 것인가) 확실하지 않습니다 .. 분명히 보이려면 어떻게 보이는지 보여 줄 수 있습니까? – developer

+0

답을 수정하고 예제를 추가했습니다. 예제에서,'EventFilter' 클래스는 소스의'Type'과 함께 작동하지만 원할 경우, 소스 인스턴스를 확인하기 위해 객체로 변경할 수 있습니다. –

0

MVVM Light Messenger 클래스를 확인하십시오. 나는 그것을 바탕으로 구현했다. 그러나 목록과 루프를 사용하지만 그 방법을 알 수는 없습니다.

메모리 누수에 대한 불만을 보았지만 영향을받지 않았으며 수정되었을 수 있습니다.

+0

겠습니까이 주소 # 2 도움? (구독자가 다른 사람의 말을 듣고있는 동안 데이터 소스의 일부 이벤트를 무시합니까?) – developer

+0

예. 등록 방법은 일반 유형 입니다.해당 유형의 메시지 만 해당 수신자에게 전송됩니다. – cadrell0

+0

감사합니다. 나는 이것을 조사하여 나를 도울 수 있는지 알아 봅니다. 나는 잠시 동안 대답을 선택하지 않을 것이다. 이것이 도움이 될지 확신 할 때까지. (그리고 다른 사람들이 답변을 게시하는지 확인하기 위해). 무리 감사! : D – developer

관련 문제