// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMemoryCache();
//Add Cqrs services
services.AddSingleton<InProcessBus>(new InProcessBus());
services.AddSingleton<ICommandSender>(y => y.GetService<InProcessBus>());
services.AddSingleton<IEventPublisher>(y => y.GetService<InProcessBus>());
services.AddSingleton<IHandlerRegistrar>(y => y.GetService<InProcessBus>());
services.AddScoped<ISession, Session>();
services.AddSingleton<IEventStore, InMemoryEventStore>();
services.AddScoped<ICache, CQRSlite.Cache.MemoryCache>();
services.AddScoped<IRepository>(y => new CacheRepository(new Repository(y.GetService<IEventStore>()), y.GetService<IEventStore>(), y.GetService<ICache>()));
services.AddTransient<IReadModelFacade, ReadModelFacade>();
//Scan for commandhandlers and eventhandlers
services.Scan(scan => scan
.FromAssemblies(typeof(InventoryCommandHandlers).GetTypeInfo().Assembly)
.AddClasses(classes => classes.Where(x => {
var allInterfaces = x.GetInterfaces();
return
allInterfaces.Any(y => y.GetTypeInfo().IsGenericType && y.GetTypeInfo().GetGenericTypeDefinition() == typeof(ICommandHandler<>)) ||
allInterfaces.Any(y => y.GetTypeInfo().IsGenericType && y.GetTypeInfo().GetGenericTypeDefinition() == typeof(IEventHandler<>));
}))
.AsSelf()
.WithTransientLifetime()
);
//Register bus
var serviceProvider = services.BuildServiceProvider();
var registrar = new BusRegistrar(new DependencyResolver(serviceProvider));
registrar.Register(typeof(InventoryCommandHandlers));
// Add framework services.
services.AddMvc();
}