private Pipeline Load(string pipelineId, out IUnitOfWork unitOfWork) { var data = _pipelineRepository.TryGetById(pipelineId); if (data == null) { unitOfWork = UnitOfWork.CreateForNonExistingPipeline(); return(null); } var createdEvent = (PipelineCreatedEvent)data.Events.First(); var instance = _factory.Create(pipelineId, createdEvent.Schema); var eventApplicator = new DynamicEventSink(instance); foreach (var evnt in data.Events.Skip(1)) { eventApplicator.On(evnt); } unitOfWork = UnitOfWork.CreateForExistingPipeline(data.Events, data.Version); return(instance); }
public T LoadSubject <T>() where T : PipelineSubject, new() { var subject = _loadedSubjects.OfType <T>().FirstOrDefault(); if (subject != null) { return(subject); } subject = new T { Sink = this }; var eventApplicator = new DynamicEventSink(subject); foreach (var evnt in _committedEvents.Concat(_uncommittedEvents)) { eventApplicator.On(evnt); } _loadedSubjects.Add(subject); return(subject); }