public static void Bind(Container container) { //inject IPrincipal // container.Register(() => // { // if (HttpContext.Current == null || HttpContext.Current.User == null) // return (null as IPrincipal); // // return HttpContext.Current.User; // }); //refer to assemblies containing handlers container.RegisterManyForOpenGeneric(typeof (IQueryHandler<,>), new[] { typeof (CreateContactCommand).Assembly }); container.RegisterManyForOpenGeneric(typeof (ICommandHandler<>), new[] { typeof (CreateContactCommand).Assembly }); //register repository implementations (you would do this by convention normally) container.RegisterWebApiRequest<ICreateAContact, ContactCreator>(); container.RegisterWebApiRequest<IReadOnlyRepository>(() => { //you may wish to get this from the container, but it could be in scope with a consumer that writes var context = new ContactAppEntities(); context.Configuration.AutoDetectChangesEnabled = false; return new ReadOnlyRepository(context); }); container.RegisterWebApiRequest<ContactAppEntities>(); container.RegisterWebApiRequest<EfUnitOfWork>(); container.Register<DbContext>(container.GetInstance<ContactAppEntities>); container.Register<IUnitOfWork>(container.GetInstance<EfUnitOfWork>); container.RegisterDecorator(typeof (ICommandHandler<>), typeof (EfUnitOfWorkTransactionCommandHandlerDecorator<>)); container.RegisterDecorator(typeof (ICommandHandler<>), typeof (PostCommitCommandHandlerDecorator<>)); container.RegisterWebApiRequest<PostCommitRegistrar>(); container.Register<IPostCommitRegistrar>(container.GetInstance<PostCommitRegistrar>); //TODO auditing should log via a bus or separate asynchronous repository, not to a logger bool traceEnabled; bool.TryParse(ConfigurationManager.AppSettings["Audit:Enabled"], out traceEnabled); if (traceEnabled) { container.RegisterDecorator(typeof (ICommandHandler<>), typeof (CommandAuditor<>)); container.RegisterDecorator(typeof (IQueryHandler<,>), typeof (QueryAuditor<,>)); } //TODO no need, this is config based // else // { // container.RegisterSingle<ILog, NullLogger>(); // } container.RegisterDecorator(typeof (IQueryHandler<,>), typeof (CacheablePerUserQueryHandler<,>)); container.RegisterDecorator(typeof (ICommandHandler<>), typeof (CommandValidator<>)); container.RegisterDecorator(typeof (IQueryHandler<,>), typeof (QueryValidator<,>)); container.RegisterWebApiRequest<IMediator, WebApiMediator>(); /* we are using data annotations for validation, so we must inform simple injector * to use this container when IServiceProvider is requested for validation */ container.RegisterWebApiRequest<IServiceProvider>(() => container); }
public ContactCreator(ContactAppEntities context) { _context = context; }