이벤트 중심 디자인에 대해 읽었습니다. 나는 실제적으로 그것의 주위에 나의 머리를 얻는 말썽이있다. 제 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);
}
}