public static IProjectionDispatcher FilterFor(
            World world,
            IProjectionDispatcher projectionDispatcher,
            string[] becauseOf,
            FilterOutcome filterOutcome)
        {
            var projectionProtocols =
                world.ActorFor(
                    new [] { typeof(IProjectionDispatcher), typeof(IProjection) },
                    typeof(FilterProjectionDispatcherActor), filterOutcome);

            var projectionFilter = Protocols.Two <IProjectionDispatcher, IProjection>(projectionProtocols);

            projectionDispatcher.ProjectTo(projectionFilter._2, becauseOf);

            return(projectionFilter._1);
        }
        public void TestThatProjectionsPipeline()
        {
            var store = Store;

            var filterOutcome       = new FilterOutcome();
            var filterOutcomeAccess = filterOutcome.AfterCompleting(3);

            var filter1 =
                FilterProjectionDispatcherActor.FilterFor(World, ProjectionDispatcher, new[] { "op-1" }, filterOutcome);

            var filter2 =
                FilterProjectionDispatcherActor.FilterFor(World, filter1, new[] { "op-1" }, filterOutcome);

            FilterProjectionDispatcherActor.FilterFor(World, filter2, new[] { "op-1" }, filterOutcome);

            var entity1 = new Entity1("123-1", 1);

            store.Write(entity1.Id, entity1, 1, Metadata.With("value1", "op-1"), new MockResultInterest());

            Assert.Equal(3, filterOutcomeAccess.ReadFrom <int>("filterCount"));
        }
 public FilterProjectionDispatcherActor(FilterOutcome outcome) => _outcome = outcome;