2008-11-03 7 views
3

이벤트 중심 디자인에 대해 읽었습니다. 나는 실제적으로 그것의 주위에 나의 머리를 얻는 말썽이있다. 제 3의 TCP 스트림에서 오는 정보를 모니터, 파싱 및 처리하는 Windows 서비스에이 방법을 사용할 것을 고려하고 있습니다. 다음과 같은 적절한 접근 방식이 있습니까, 아니면 뭔가 빠졌습니까? 나는 단순히 처리 및/또는 제기하는 "ServiceAgent"인스턴스를 등록 할 수 있습니다 MEF 또는 유사한을 사용하여, 다음이것은 Windows 서비스에 대한 적절한 이벤트 기반 접근 방식입니까?

public class MyService 
{      

    public void RegisterAgent(ServiceAgent agent) 
    { 
     Log("Initializing agent " + agent); 
     agent.Initialize(this); 
     Log("Done intializing agent " + agent); 
    } 

    public void Log(string messageText) 
    { 
     OnSimpleLogEventLogged(this, new SimpleLogEventArgs(messageText)); 
    } 

    protected void Raise<T>(EventHandler<T> eventHandler, object sender, T args) where T : EventArgs 
    { 
     var handler = eventHandler; 
     if (handler == null) return;      
     handler(sender, args); 

    } 

    public event EventHandler<SimpleLogEventArgs> SimpleLogEventLogged; 
    protected void OnSimpleLogEventLogged(object sender, SimpleLogEventArgs args) 
    { 
     Raise(SimpleLogEventLogged, sender, args); 
    } 

    public event EventHandler<TextRecievedEventArgs > TextRecieved; 
    public void OnTextRecieved(object sender, TextRecievedEventArgs args) 
    { 
     Raise(TextRecieved, sender, args);    
    } 

    public event EventHandler<TextParsedEventArgs> TextParsed; 
    public void OnTextParsed(object sender, TextParsedEventArgs args) 
    { 
     Raise(TextParsed, sender, args);    
    } 

    ... 
} 

:

내 계획은 이벤트에 대한 주요 서비스가 될 단순히 컨테이너를하는 것입니다 이벤트, 선택적으로 백그라운드 스레드에서 수행. 예를 들어 :

public class TextParsingAgent : ServiceAgent 
{ 

    public override void Initialize(MyService service) 
    { 
     service.TextRecieved += TextRecieved; 
     base.Initialize(service); 
    } 

    void TextRecieved(object sender, TextRecievedEventArgs e) 
    { 
     ThreadPool.QueueUserWorkItem(TextRecievedAsync, e); 
    } 

    private void TextRecieved(object state) 
    { 
     var e = (TextRecievedEventArgs)state; 
     //TODO:Parse text into something meaningful and store in textParseEventArgs 
     service.OnTextParsed(textParseEventArgs); 
    } 
} 

답변

1

나는 개인적으로 코드에 상당히 좋은 전반적인 structue이라고 생각, 그것은 쉽게이 당신에게 좋은 확장 성을 허용하고 서비스에서 통지하여 자신의 작업에 논리 단위를 분리 나중에 다른 serviceagents를 설정해야하는 경우. Raise() 방법은 널 (null) 검사가 간소화하는 경우

1

, 당신과 같이 대신 람다 표현식을 사용하여 null이 아닌에 이벤트 핸들러를 초기화 할 수 있습니다 :

public event EventHandler<TextParsedEventArgs> TextParsed = (sender, e) => { }; 

그런 다음 당신이없이 TextParsed(...)를 호출 할 수 있습니다 null 체크는 코드를 더 쉽게 따라 할 수 있습니다.