private static IContainer BuildContainer()
        {
            var builder = new ContainerBuilder();

            builder.RegisterType<Database>().As<IDatabase>().InstancePerLifetimeScope();
            builder.RegisterType<ConsoleLogger>().As<ILogger>().InstancePerLifetimeScope();

            // Register the mediator
            builder.Register(c => new Mediator(c.Resolve<IComponentContext>().Resolve))
                .AsImplementedInterfaces()
                .SingleInstance();

            // Register all IValidator<T>
            builder.RegisterAssemblyTypes(typeof (Program).Assembly)
                .AsClosedTypesOf(typeof (IValidator<>))
                .InstancePerLifetimeScope();

            // Register all ICommandHandler<TCommand, TResult>
            builder.RegisterAssemblyTypes(typeof (Program).Assembly)
                .AsClosedTypesOf(typeof (ICommandHandler<,>), "handler")
                .InstancePerLifetimeScope();

            // Decorate command handlers with validation
            builder.RegisterGenericDecorator(
                typeof(ValidationCommandHandler<,>),
                typeof(ICommandHandler<,>), "handler", "validation");

            // Decorate validation command handlers with timing
            builder.RegisterGenericDecorator(
                typeof (TimingCommandHandler<,>),
                typeof (ICommandHandler<,>), "validation");

            return builder.Build();
        }
Example #2
0
        // This method gets called by a runtime.
        // Use this method to add services to the container
        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            var builder = new ContainerBuilder();

            builder.RegisterType<ConcreteCacheProvider>().As<ICacheProvider>();
            builder.RegisterType<SerilogLoggerFactory>().As<ILoggerFactory>();

            builder.RegisterType(typeof(ThingyRepository)).Named<IRepository<Thingy>>("repository");

            builder.RegisterGenericDecorator(
                    typeof(CachedRepository<>),
                    typeof(IRepository<>),
                    fromKey: "repository")
                    .Keyed("decorated", typeof(IRepository<>));

            builder.RegisterGenericDecorator(
                    typeof(PerformanceLoggingRepository<>),
                    typeof(IRepository<>),
                    fromKey: "decorated");

            builder.Populate(services);

            var container = builder.Build();

            return container.ResolveOptional<IServiceProvider>();
        }
Example #3
0
        public static IContainer Create(Action<ContainerBuilder> additionalRegistrations)
        {
            IContainer container = null;

            var builder = new ContainerBuilder();

            //Command handlers
            var featuresAssembly = typeof(Features.Features).Assembly;
            builder.RegisterAssemblyTypes(featuresAssembly)
                .As(type => type.GetInterfaces()
                .Where(interfaceType => !interfaceType.Namespace.Contains("Decorators") && interfaceType.IsClosedTypeOf(typeof(IRequestHandler<,>)))
                .Select(interfaceType => new KeyedService("requestHandler", interfaceType))); // --> we need a keyed service as the decorated service will become the key-less one

            //query handlers
            builder.RegisterAssemblyTypes(typeof(GetCompleteInventoryQueryHandler).Assembly)
                .Where(interfaceType => !interfaceType.Namespace.Contains("Decorators") && interfaceType.IsClosedTypeOf(typeof(IRequestHandler<,>)))
                .AsImplementedInterfaces();

            //builder.Register(c => new Mediator(c.Resolve<IComponentContext>())).AsImplementedInterfaces();
            builder.RegisterSource(new ContravariantRegistrationSource());
            builder.RegisterAssemblyTypes(typeof(IMediator).Assembly).AsImplementedInterfaces();
            builder.Register<SingleInstanceFactory>(ctx =>
            {
                var c = ctx.Resolve<IComponentContext>();
                return t => c.Resolve(t);
            });
            builder.Register<MultiInstanceFactory>(ctx =>
            {
                var c = ctx.Resolve<IComponentContext>();
                return t => (IEnumerable<object>)c.Resolve(typeof(IEnumerable<>).MakeGenericType(t));
            });

            builder.RegisterType<UnitOfWork>().AsImplementedInterfaces();
            builder.Register<IQueryContext>(c => new QueryContext(new BookKeepingContext()));

            builder.Register<IUnitOfWork>(c => new UnitOfWork(new BookKeepingContext())).SingleInstance();

            builder.RegisterType<LegoSetRepository>().AsImplementedInterfaces();
            //builder.RegisterType<InMemLegoSetRepository>().AsImplementedInterfaces();

            builder.RegisterAssemblyTypes(featuresAssembly)
               .Where(t => t.Name.EndsWith("Validator"))
               .AsImplementedInterfaces();

            //register the decorator - works
            builder.RegisterGenericDecorator(typeof(ValidationHandler<,>), typeof(IRequestHandler<,>), "requestHandler", "decoratedWithValidation");
            builder.RegisterGenericDecorator(typeof(LogHandler<,>), typeof(IRequestHandler<,>), "decoratedWithValidation", "decoratedWithLog");
            builder.RegisterGenericDecorator(typeof(UnitOfWorkHandler<,>), typeof(IRequestHandler<,>), "decoratedWithLog"); //last decorator must be keyless

            if (additionalRegistrations != null)
                additionalRegistrations.Invoke(builder);

            container = builder.Build();

            return container;
        }
Example #4
0
        protected override void Load(ContainerBuilder builder)
        {
            base.Load(builder);

              var nancyAssembly = typeof(AppModule).Assembly;

              // Register validators
              builder.RegisterAssemblyTypes(nancyAssembly)
             .AsClosedTypesOf(typeof(IValidator<>))
             .SingleInstance();

              // register all query handlers
              builder.RegisterAssemblyTypes(nancyAssembly)
             .Where(t => t.IsClosedTypeOf(typeof(IHandler<>)))
             .AsImplementedInterfaces();
              builder.RegisterAssemblyTypes(nancyAssembly)
             .Where(t => t.IsClosedTypeOf(typeof(IHandler<,>)))
             .As(t => new KeyedService("queryHandler", t.GetInterfaces().Single(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IHandler<,>))));
              builder.RegisterGenericDecorator(typeof(RequestValidationAwareHandler<,>), typeof(IHandler<,>), "queryHandler");

              // Register other stuff
              builder.RegisterType<NancyIdentityFromContextAssigner>()
             .AsImplementedInterfaces()
             .SingleInstance();
              builder.RegisterType<NancySecurityContextFactory>()
             .AsImplementedInterfaces()
             .SingleInstance();
        }
Example #5
0
        protected override void Load(ContainerBuilder builder)
        {
            var assemblies = GetAssemblies();

            //register mediator
            builder.RegisterType<Mediator>()
                .As<IMediator>()
                .InstancePerLifetimeScope();

            //register request handlers
            builder.RegisterAssemblyTypes(assemblies)
                .Where(type => type.IsClosedTypeOf(typeof(IRequestHandler<,>)))
                .As(type => new KeyedService("handler", GetGenericType(type)))
                .InstancePerLifetimeScope();

            //register request validators
            builder.RegisterAssemblyTypes(assemblies)
                .AsClosedTypesOf(typeof(IValidator<>))
                .AsImplementedInterfaces()
                .InstancePerLifetimeScope();

            //register validation decorator
            builder.RegisterGenericDecorator(
                typeof(ValidationRequestHandler<,>),
                typeof(IRequestHandler<,>),
                fromKey: "handler",
                toKey: "requestPipeline")
                .InstancePerLifetimeScope();
        }
Example #6
0
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterAssemblyTypes(typeof(Repository<>).Assembly)
                .AsClosedTypesOf(typeof(IRepository<>))
                .InstancePerLifetimeScope();

            builder.RegisterAssemblyTypes(typeof(ICommandHandler<,>).Assembly)
                //.AsClosedTypesOf(typeof(ICommandHandler<,>))
                //.Named("implementor", typeof(ICommandHandler<,>))
                .As(t => t.GetInterfaces()
                  .Where(i => i.IsClosedTypeOf(typeof(ICommandHandler<,>)))
                  .Select(i => new KeyedService("commandImplementor", i))
                  .Cast<Service>())
                .InstancePerLifetimeScope();

            builder.RegisterGenericDecorator(
                typeof(TransactionalCommandHandler<,>),
                typeof(ICommandHandler<,>), fromKey: "commandImplementor");

            builder.RegisterAssemblyTypes(typeof(IQueryHandler<,>).Assembly)
                .AsClosedTypesOf(typeof(IQueryHandler<,>))
                .InstancePerLifetimeScope();

            builder.RegisterType<AuthorizationServerProvider>()
                .AsSelf();

            builder.RegisterType<ApplicationDbContext>()
                .AsImplementedInterfaces()
                .AsSelf()
                .InstancePerLifetimeScope();

            builder.RegisterType<StubCryptoStore>()
                .AsImplementedInterfaces()
                .SingleInstance();

            builder.RegisterType<GcmEncryptionAlgorithm>()
                .AsImplementedInterfaces()
                .SingleInstance();

            builder.RegisterType<HmacSha512HashAlgorithm>()
                .AsImplementedInterfaces()
                .SingleInstance();

            builder.RegisterType<NullUserBasedDataProtection>()
                .AsImplementedInterfaces()
                .SingleInstance();

            builder.RegisterType<CryptoService>()
                .AsImplementedInterfaces()
                .SingleInstance();
        }
Example #7
0
        /// <summary>
        /// Decorates all components implementing open generic service type.
        /// <remarks>
        /// Decorated type should be implemented by a class that implements only one generic type of the same type
        /// since Autofac is not able to properly create a decorator if multiple generic types implemented in a single class.
        /// </remarks>
        /// </summary>
        /// <typeparam name="TImplementer">The type of the service implementation.</typeparam>
        /// <typeparam name="TService">Service type being decorated. Must be an open generic type.</typeparam>
        /// <param name="builder">Container builder.</param>
        /// <param name="decoratorType">The type of the decorator. Must be an open generic type, and accept a parameter
        /// of type <typeparamref name="TService" />, which will be set to the instance being decorated.</param>
        public static void RegisterGenericDecorator <TService>(this ContainerBuilder builder, Type decoratorType)
        {
            var serviceType = typeof(TService);

            if (!serviceType.IsGenericType)
            {
                throw new ArgumentException("Service type should be generic type");
            }

            builder.RegisterGenericDecorator(
                decoratorType,
                serviceType.GetGenericTypeDefinition(),
                context => IsTypeAssignableFrom <TService>(context));
        }
Example #8
0
        private static void RegisterHandlers(ContainerBuilder builder)
        {
            builder.RegisterType<Mediator>()
                .As<IMediator>();

            builder.RegisterAssemblyTypes(typeof(Mediator).Assembly)
                .As(type => type.GetInterfaces()
                    .Where(interfaceType => interfaceType.IsClosedTypeOf(typeof(IRequestHandler<,>)))
                    .Select(interfaceType => new KeyedService("handler", interfaceType)));

            builder.RegisterGenericDecorator(
                typeof(LoggingHandlerDecorator<,>),
                typeof(IRequestHandler<,>),
                fromKey: "handler");
        }
        public ContainerBuilder GetRegistrations()
        {
            var builder = new ContainerBuilder();

            builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

            //Security
            builder.Register<ISecurityPoint>(_ => new DefaultSecurityPoint()).SingleInstance();

            //  Data & Co.
            builder.Register(_ => new UnitOfWork(_.Resolve<ThingDbContext>()))
                .InstancePerLifetimeScope().AsImplementedInterfaces();

            builder.Register(_ => new ThingRepository(_.Resolve<ThingDbContext>()))
                .InstancePerLifetimeScope().AsImplementedInterfaces();

            builder.RegisterType<ThingDbContext>()
                .AsSelf().InstancePerLifetimeScope();

            //  Validators
            RegisterValidators(builder);

            //  MediatR
            builder.RegisterSource(new ContravariantRegistrationSource());
            builder.RegisterAssemblyTypes(typeof (IMediator).Assembly)
                .AsImplementedInterfaces();
            builder.RegisterAssemblyTypes(typeof (ThingCommand).Assembly)
                .As(o => o.GetInterfaces()
                    .Where(i => i.IsClosedTypeOf(typeof (IAsyncRequestHandler<,>)))
                    .Select(i => new KeyedService("async-handlers", i)));
            builder.Register<SingleInstanceFactory>(ctx =>
            {
                var c = ctx.Resolve<IComponentContext>();
                return t => c.Resolve(t);
            });
            builder.Register<MultiInstanceFactory>(ctx =>
            {
                var c = ctx.Resolve<IComponentContext>();
                return t => (IEnumerable<object>) c.Resolve(typeof (IEnumerable<>).MakeGenericType(t));
            });
            builder.RegisterGenericDecorator(typeof (AsyncValidationRequestHandler<,>), typeof (IAsyncRequestHandler<,>),
                "async-handlers"); // The outermost decorator should not have a toKey

            return builder;
        }
Example #10
0
        protected override void Load(ContainerBuilder builder)
        {
            //TODO: clean this up scanning the assembly multiple times is prolly not a good idea.

            builder.RegisterSource(new ContravariantRegistrationSource());

            builder.RegisterAssemblyTypes(typeof(IMediator).Assembly)
                .AsImplementedInterfaces();

            builder.Register<SingleInstanceFactory>(ctx =>
            {
                var c = ctx.Resolve<IComponentContext>();
                return t => c.Resolve(t);
            });
            builder.Register<MultiInstanceFactory>(ctx =>
            {
                var c = ctx.Resolve<IComponentContext>();
                return t => (IEnumerable<object>)c.Resolve(typeof(IEnumerable<>).MakeGenericType(t));
            });

            //register all notification handlers
            builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
                .As(type => type.GetInterfaces()
                    .Where(interfacetype => interfacetype.IsClosedTypeOf(typeof(IAsyncNotificationHandler<>))));

            //register all pre handlers
            builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
                .As(type => type.GetInterfaces()
                    .Where(interfacetype => interfacetype.IsClosedTypeOf(typeof(IAsyncPreRequestHandler<>))));

            //register all post handlers
            builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
                .As(type => type.GetInterfaces()
                    .Where(interfacetype => interfacetype.IsClosedTypeOf(typeof(IAsyncPostRequestHandler<,>))));

            //register all handlers
            builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
               .As(type => type.GetInterfaces()
                   .Where(interfaceType => interfaceType.IsClosedTypeOf(typeof(IAsyncRequestHandler<,>)))
                   .Select(interfaceType => new KeyedService("asyncRequestHandler", interfaceType)));

            //register pipeline decorators
            builder.RegisterGenericDecorator(typeof(AsyncMediatorPipeline<,>), typeof(IAsyncRequestHandler<,>), "asyncRequestHandler");
        }
        private static void RegisterContentParts(IAppBuilder app, ContainerBuilder builder)
        {
            string encryptionKey = "dn18fj!dhA)mp";

            builder.RegisterType<NLogLogger>().As<ICommonLogger>();
            builder.RegisterType<AspNetCacheProvider>().As<ICacheProvider>();
            builder.RegisterInstance(new ContentEncryption(encryptionKey)).As<IContentEncryption>();
            builder.RegisterType<NoCaptchaProvider>().As<ICaptchaProvider>();
            builder.RegisterType<CommentStateProvider>().As<ICommentStateProvider>();

            builder.RegisterInstance(ESSettings.FromConfig()).AsSelf();
            builder.RegisterType<ESObjectIdQueries>().As<ISearchQueries<ObjectId>>();

            builder.RegisterInstance(MongoDbConnectionSettings.FromConfig()).AsSelf();
            builder.RegisterType<MongoDbContentQueries>().Named<IContentQueries<ObjectId>>("data");
            builder.RegisterType<MongoDbCommentQueries>().Named<ICommentQueries<ObjectId>>("data");
            builder.RegisterType<MongoDbCategoryQueries>().Named<ICategoryQueries<ObjectId>>("data");

            builder.RegisterGenericDecorator(
                typeof(SingleInstancePostCache<>), typeof(IContentQueries<>), fromKey: "data");
            builder.RegisterGenericDecorator(
                typeof(SingleInstanceCommentCache<>), typeof(ICommentQueries<>), fromKey: "data");
            builder.RegisterGenericDecorator(
                typeof(SingleInstanceCategoryCache<>), typeof(ICategoryQueries<>), fromKey: "data");

            builder.RegisterType<CategoryManager<ObjectId>>().As<ICategoryManager<ObjectId>>();
            builder.RegisterType<CommentManager<ObjectId>>().As<ICommentManager<ObjectId>>().InstancePerRequest();
            builder.RegisterType<CustomContentManager>().AsSelf().InstancePerRequest();
        }
Example #12
0
        private static void DecorateHandlers(ContainerBuilder builder)
        {
            builder.RegisterGenericDecorator(
                typeof(ValidationRequestHandler<,>),
                typeof(IRequestHandler<,>),
                fromKey: "handler1",
                toKey: "handler2")
                .InstancePerMatchingLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag);

            builder.RegisterGenericDecorator(
                typeof(LogRequestHandler<,>),
                typeof(IRequestHandler<,>),
                fromKey: "handler2",
                toKey: Consts.RequestPipelineKey)
                .InstancePerMatchingLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag);
        }
Example #13
0
 private static void RegisterRequestDecorator(ContainerBuilder builder, Type decoratorType)
 {
     builder.RegisterGenericDecorator(decoratorType, typeof(IRequestHandler <>), fromKey: RequestKey);
 }
        static void Main(string[] args)
        {
            var builder = new ContainerBuilder();
            var executingAssembly = Assembly.GetExecutingAssembly();
            //for debugging only
            var tasks = executingAssembly.GetTypes().Where(t => t.Name.EndsWith("Task", StringComparison.Ordinal)).ToList();
            builder.RegisterAssemblyTypes(executingAssembly)
                .As(type => type.GetInterfaces()
                .Where(interfaceType => interfaceType.IsClosedTypeOf(typeof (IRequestHandler<, >)))
                .Select(interfaceType => new KeyedService("requestHandler", interfaceType))); // --> we need a keyed service as the decorated service will become the key-less one

            //register the decorator - works
            builder.RegisterGenericDecorator(typeof (LogHandler<, >), typeof (IRequestHandler<, >), "requestHandler", "decoratedWithLog");
            builder.RegisterGenericDecorator(typeof (TransactionHandler<, >), typeof (IRequestHandler<, >), "decoratedWithLog"); //double logged! ->key-less
            var container = builder.Build();

            //get the original undecorated handler by using key
            var commandUndec = container.ResolveKeyed<IRequestHandler<TestRequest, Unit>>("requestHandler");
            commandUndec.Handle(new TestRequest{Title = "undecorated"});
            Console.WriteLine();

            //get the decorated one
            var command = container.Resolve<IRequestHandler<TestRequest, Unit>>();
            command.Handle(new TestRequest{Title = "decorated"});
            Console.WriteLine();

            //finally, use the mediator to resolve everything for us
            var _mediator = new Mediator(container);
            _mediator.Send(new TestRequest{Title = "Test"});
            Console.ReadLine();
        }