예제 #1
0
        public void Test()
        {
            var builder = new CqrsEngineBuilder();
            builder.Domain(m =>
                {
                    m.HandlerSample<Definitions.Define.Consumer<Definitions.Define.ICommand>>(c => c.Consume(null));
                    m.ContextFactory((e,x) => new Definitions.Define.MyContext(e.GetAttribute("EntityId","")));
                });
            builder.Storage(m => m.AtomicIsInMemory());
            builder.Memory(m =>
                {
                    m.AddMemorySender("in", c => c.IdGeneratorForTests());
                    m.AddMemoryProcess("in");
                });

            builder.Advanced.ConfigureContainer(cb =>
                {
                    cb.Register(c => new InMemoryEventStreamer<IAccountEvent>(c.Resolve<IMessageSender>())).
                        SingleInstance();

                    cb.RegisterType<InMemoryEventStreamer<IAccountEvent>>().SingleInstance();
                    cb.RegisterType<AccountAggregateRepository>().SingleInstance();

                });

            using (var source = new CancellationTokenSource())
            using (var engine = builder.Build())
            {
                engine.Start(source.Token);

                var sender = engine.Resolve<IMessageSender>();
                sender.SendOne(new CreateAccount("Sample User"), cb => cb.AddString("EntityId","1"));
                sender.SendOne(new AddLogin("login","pass"), cb => cb.AddString("EntityId", "1"));

                source.Token.WaitHandle.WaitOne(5000);
                source.Cancel();
            }
        }
예제 #2
0
파일: Bootstrapper.cs 프로젝트: trbngr/m-r
        private static CqrsEngineHost ConfigureHost()
        {
            var builder = new CqrsEngineBuilder();

             builder.Domain(d =>
             {
                 d.InAssemblyOf<CreateInventoryItem>();
                 d.HandlerSample<IConsume<Define.Command>>(m => m.Consume(null));
             });

             builder.File(f =>
             {
                 f.AddFileSender(storageConfig, "events");
                 f.AddFileProcess(storageConfig, "commands", p =>
                 {
                     p.WhereFilter(x => x.WhereMessagesAre<Define.Command>());
                     p.DispatchAsCommandBatch();
                 });
                 f.AddFileProcess(storageConfig, "events", p=>
                 {
                     p.WhereFilter(x => x.WhereMessagesAre<DomainEvent>());
                     p.DispatchAsEvents();
                 });
             });

             builder.Storage(s =>
             {
                 s.TapeIsInFiles(Path.Combine(storageConfig.Folder.FullName, "eventstore"));
                 s.AtomicIsInFiles(storageConfig.Folder.FullName, b =>
                 {
                     b.WhereEntityIs<IEntity>();
                     b.WhereSingletonIs<ISingleton>();
                 });
                 s.StreamingIsInFiles(storageConfig.Folder.FullName);
             });

             builder.Advanced.ConfigureContainer(c =>
             {
                 c.RegisterType<ReadModelFacade>().As<IReadModelFacade>();

                 c.RegisterType<Repository<InventoryItem>>().As<IRepository<InventoryItem>>();

                 c.RegisterType<EventStore>().As<IEventStore>();
             });

             return builder.Build();
        }
        static void TestConfiguration(Action<CqrsEngineBuilder> build, int useMessages)
        {
            var builder = new CqrsEngineBuilder();
            build(builder);

            var subj = new Subject<ISystemEvent>();

            builder.Advanced.Observers.Clear();
            builder.Advanced.RegisterObserver(subj);

            var step = (useMessages / 5);
            int count = 0;
            var watch = new Stopwatch();
            using (var token = new CancellationTokenSource())
            {
                subj
                    .OfType<EnvelopeAcked>()
                    .Subscribe(ea =>
                        {
                            count += 1;

                            if ((count % step) == 0)
                            {
                                var messagesPerSecond = count / watch.Elapsed.TotalSeconds;
                                Console.WriteLine("{0} - {1}", count, Math.Round(messagesPerSecond, 1));
                            }

                            if (ea.Attributes.Any(ia => ia.Key == "last"))
                            {
                                token.Cancel();
                            }
                        });

                using (var engine = builder.Build())
                {
                    // first we send X then we check
                    var sender = engine.Resolve<IMessageSender>();

                    for (int i = 0; i < useMessages; i++)
                    {
                        sender.SendOne(new UsualMessage { HasData = true });
                    }
                    sender.SendOne(new UsualMessage { HasData = true}, b => b.AddString("last"));

                    watch.Start();
                    engine.Start(token.Token);
                    token.Token.WaitHandle.WaitOne(10000);
                }
            }
        }