Page History
...
| Code Block | ||
|---|---|---|
| ||
public class SearchActor : ReceiveActor
{
private readonly ILoggingAdapter _logger = Context.GetLogger();
private IActorRef? testProbe;
private readonly NoteRepository noteRepository;
private IActorRef? historyActor;
public SearchActor()
{
noteRepository = new NoteRepository();
Receive<IActorRef>(actorRef =>
{
testProbe = actorRef;
testProbe.Tell("done-ready");
});
Receive<SetHistoryActorCommand>(msg =>
{
historyActor = msg.HistoryActor;
if (testProbe != null)
{
testProbe.Tell("done-set-history");
}
});
Receive<SearchNoteByTextCommand>(command =>
{
_logger.Info($"SearchNoteByTextCommand: {command.Title}, {command.Content}, {command.Category}");
var notes = noteRepository.SearchByText(command.Title, command.Content, command.Category);
_logger.Info($"SearchNoteByTextCommand: {notes.Count} notes found");
Sender.Tell(new SearchNoteActorResult()
{
Notes = notes
});
if (testProbe != null)
{
testProbe.Tell(new SearchNoteActorResult()
{
Notes = notes
});
}
if(historyActor != null)
{
historyActor.Tell(notes);
}
});
Receive<SearchNoteByRadiusActorCommand>(command =>
{
var notes = noteRepository.SearchByRadius(command.Latitude, command.Longitude, command.Radius);
Sender.Tell(new SearchNoteActorResult()
{
Notes = notes
});
if (testProbe != null)
{
testProbe.Tell(new SearchNoteActorResult()
{
Notes = notes
});
}
if(historyActor != null)
{
historyActor.Tell(notes);
}
});
Receive<SearchNoteByVectorCommand>(command =>
{
var notes = noteRepository.SearchByVector(command.Vector, command.TopN);
Sender.Tell(new SearchNoteActorResult()
{
Notes = notes
});
if (testProbe != null)
{
testProbe.Tell(new SearchNoteActorResult()
{
Notes = notes
});
}
if(historyActor != null)
{
historyActor.Tell(notes);
}
});
}
} |
- 액터모델을 이용한 이벤트 기반의 코드이며 서버기능을 수행할수 있습니다. REST 인터페이스가 익숙하다면 액터모델을 걷어내고 RestAPI화해 교체할수 있는 영역의 코드입니다.
- HistoryActor와 상호작용해~ 검색을 시도하면 검색 히스토리를 남깁니다. 히스토리 작성이 성공할때까지 대기하지 않고~ 성공여부도 관심사가 아니며 단지필요한 이벤트를 발생시킵니다. FireAndForgot 패턴의 일종입니다historyActor를 초기화중 지정이 될수있으며, 검색결과 이용기록을 보존합니다. 최근 검색한 노트를 요청해 다시 이용할수 있습니다.
- 이벤트 소싱등 CQRS패턴을 MCP내부 액터모델에 적용한다고하면 다음문서를참고해 능동적으로작동하는 액터모델을 이용 Agent코드를 작성할수도 있습니다.
...