Пример #1
0
        public void Configuration(IAppBuilder app)
        {
            // register assemblies
            AutofacAssemblyStore.LoadAssembly("Brandscreen.Framework");
            AutofacAssemblyStore.LoadAssembly("Brandscreen.Core");
            AutofacAssemblyStore.LoadAssembly(Assembly.GetExecutingAssembly());

            // create and activate host
            _host = HostStarter.CreateHost();
            _host.Activate(); // Note: HostEventsHandler will be called

            // ensure http configuration
            InitializeHttp(_host);

            // setting logger factory so it can do logging via NLog
            app.SetLoggerFactory(_host.LifetimeScope.Resolve <ILoggerFactory>());

            // handling begin and end request events
            app.Use(async(context, next) =>
            {
                _host.BeginRequest(); // begin request

                try
                {
                    await next();
                }
                catch (OperationCanceledException ex)
                {
                    var logger = app.CreateLogger(GetType());
                    logger.WriteWarning(ex.Message);
                }
                catch (Exception ex)
                {
                    var logger = app.CreateLogger(GetType());
                    logger.WriteError("owin error", ex);
                    throw;
                }
                finally
                {
                    _host.EndRequest(); // end request
                }
            });

            // handling application end event
            var properties = new AppProperties(app.Properties);

            properties.OnAppDisposing.Register(() => _host.Terminate()); // end app

            // setup autofac middleware
            app.UseAutofacMiddleware(_host.LifetimeScope); // IOwinContext is registered by autofac when calling this

            // setup
            ConfigureMvc(app, _host);
            ConfigureApi(app, _host);
        }
        protected override void Load(ContainerBuilder builder)
        {
            // assemblies
            var assemblies = AutofacAssemblyStore.GetAssemblies();

            // validators: types derived from AbstractValidator<>
            builder.RegisterAssemblyTypes(assemblies)
            .Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(AbstractValidator <>))
            .Keyed(type => type.BaseType?.GenericTypeArguments[0], typeof(IValidator))
            .SingleInstance();
        }
Пример #3
0
        protected override void Load(ContainerBuilder builder)
        {
            // warming up the mapper to trigger PlatformAdapter loads extra things
            Mapper.Initialize(configuration => { });

            // assemblies
            var assemblies = AutofacAssemblyStore.GetAssemblies();

            // depend by ConfigurationStore
            builder.RegisterAssemblyTypes(assemblies)
            .Where(type => type.IsSubclassOf(typeof(Profile)))
            .As <Profile>()
            .SingleInstance();

            // depend by ConfigurationStore
            builder.RegisterInstance(new TypeMapFactory())
            .As <ITypeMapFactory>()
            .SingleInstance();

            // depend by ConfigurationStore
            MapperRegistry.Mappers.Add(new PagedListMapper());
            builder.RegisterInstance(MapperRegistry.Mappers)
            .As <IEnumerable <IObjectMapper> >();

            // depend by MappingEngine
            builder.RegisterType <ConfigurationStore>()
            .AsImplementedInterfaces()
            .SingleInstance()
            .OnActivating(args =>
            {
                // add profiles
                foreach (var profile in args.Context.Resolve <IEnumerable <Profile> >())
                {
                    args.Instance.AddProfile(profile);
                }
            });

            // depdend by MappingEngineWrapper
            // Note: there is constructor specified for MappingEngine
            // Because it uses the most parameters constructor in unit test project by supplying mocking parameter objects which is unwanted
            builder.RegisterType <MappingEngine>()
            .UsingConstructor(typeof(IConfigurationProvider))
            .AsSelf()
            .SingleInstance();

            // MappingEngine wrapper
            builder.RegisterType <MappingEngineWrapper>()
            .As <IMappingEngine>()
            .InstancePerLifetimeScope();
        }
Пример #4
0
        public static IContainer CreateHostContainer()
        {
            var builder = new ContainerBuilder();

            // assemblies
            var assemblies = AutofacAssemblyStore.GetAssemblies();

            // startable
            builder.RegisterAssemblyTypes(assemblies)
            .Where(t => typeof(IStartable).IsAssignableFrom(t))
            .As <IStartable>()
            .SingleInstance();

            // modules
            builder.RegisterModule(new LoggingFactoryModule());
            builder.RegisterModule(new LoggingModule());
            builder.RegisterModule(new EventsModule());
            builder.RegisterModule(new CacheModule());
            builder.RegisterModule(new SettingModule());

            // event bus
            builder.RegisterType <DefaultEventBus>().As <IEventBus>().SingleInstance();
            builder.RegisterType <DefaultExceptionPolicy>().As <IExceptionPolicy>().SingleInstance();

            // cache
            builder.RegisterType <DefaultCacheHolder>().As <ICacheHolder>().SingleInstance();
            builder.RegisterType <DefaultCacheContextAccessor>().As <ICacheContextAccessor>().SingleInstance();
            builder.RegisterType <DefaultParallelCacheContext>().As <IParallelCacheContext>().SingleInstance();
            builder.RegisterType <DefaultAsyncTokenProvider>().As <IAsyncTokenProvider>().SingleInstance();

            // volatile providers
            RegisterVolatileProvider <Clock, IClock>(builder);

            // assembly resolvers
            builder.RegisterType <DefaultAssemblyLoader>().As <IAssemblyLoader>().SingleInstance();
            builder.RegisterType <AppDomainAssemblyNameResolver>().As <IAssemblyNameResolver>().SingleInstance();
            builder.RegisterType <GacAssemblyNameResolver>().As <IAssemblyNameResolver>().SingleInstance();
            builder.RegisterType <FrameworkAssemblyNameResolver>().As <IAssemblyNameResolver>().SingleInstance();

            //
            builder.RegisterType <DefaultHost>().As <IHost>().SingleInstance().ExternallyOwned(); // manually dispose

            var container = builder.Build();

            return(container);
        }
Пример #5
0
        protected override void Load(ContainerBuilder builder)
        {
            // assemblies
            var assemblies = AutofacAssemblyStore.GetAssemblies();

            builder.RegisterType <ServiceBus>()
            .As <IServiceBus>()
            .SingleInstance()
            .OnActivated(args =>
            {
                var siteSettings = args.Context.Resolve <ISiteSettings>();
                var messageTypes = assemblies.SelectMany(x => x.ExportedTypes).Where(x => typeof(IMessage).IsAssignableFrom(x) && !x.IsInterface);
                foreach (var messageType in messageTypes)
                {
                    args.Instance.RegisterMessageEndpoint(messageType, siteSettings.QueueEndPoint);
                }
            });
        }
Пример #6
0
        protected override void Load(ContainerBuilder builder)
        {
            // assemblies
            var assemblies = AutofacAssemblyStore.GetAssemblies();

            // ------------------WebApi------------------
            // REF: http://docs.autofac.org/en/latest/integration/webapi.html

            // Get your HttpConfiguration.
            var config = Startup.HttpConfiguration;

            builder.RegisterInstance(config);

            // Register your Web API controllers.
            builder.RegisterApiControllers(assemblies).EnableClassInterceptors();

            // OPTIONAL: Register the Autofac filter provider.
            builder.RegisterWebApiFilterProvider(config);

            // ------------------MVC------------------
            // REF: http://docs.autofac.org/en/latest/integration/mvc.html

            if (HttpContext.Current == null)
            {
                return;                              // Note: only enable mvc when hosting in IIS
            }
            // Register your MVC controllers.
            builder.RegisterControllers(assemblies).EnableClassInterceptors();

            // OPTIONAL: Register model binders that require DI.
            builder.RegisterModelBinders(assemblies);
            builder.RegisterModelBinderProvider();

            // OPTIONAL: Register web abstractions like HttpContextBase.
            builder.RegisterModule <AutofacWebTypesModule>();

            // OPTIONAL: Enable property injection in view pages.
            builder.RegisterSource(new ViewRegistrationSource());

            // OPTIONAL: Enable property injection into action filters.
            builder.RegisterFilterProvider();
        }
Пример #7
0
        public void SetUp()
        {
            // init container host for testing, web api will use different one
            AutofacAssemblyStore.LoadAssembly("Brandscreen.Framework");
            AutofacAssemblyStore.LoadAssembly("Brandscreen.Core");
            AutofacAssemblyStore.LoadAssembly("Brandscreen.WebApi");
            Host = HostStarter.CreateHost();
            AutofacAssemblyStore.ClearAssemblies(); // clear loaded assemblies so that it won't affect web api Startup

            // passes the test scope to web app, so it will use to activate RepositoryTestModule
            // the scope will be set again on the starting of each test case in IocSupportedTests
            // the scope is used for resolving same instance of objects as the ones in current running test case for each http request made through the test case
            // e.g. the database context must be the same both in the current running test case and web api current request context,
            // then it is able to rollback all temporary data within the test scope.
            Startup.SetCurrentTestScope(Host.LifetimeScope);

            // init web app
            var ipAddress = LocalIpAddress();

            Url = $"http://{ipAddress?.ToString() ?? "localhost"}:{Port}/";
            Console.WriteLine("starting web app at {0}.", Url);
            _webApp = WebApp.Start <Startup>(Url);
            Console.WriteLine("started web app.");
        }
Пример #8
0
 public virtual void MockingTestFixtureTearDown()
 {
     AutofacAssemblyStore.ClearAssemblies();
 }
Пример #9
0
 public virtual void MockingTestFixtureSetUp()
 {
     AutofacAssemblyStore.LoadAssembly("Brandscreen.WebApi"); // AutoMapperModule needs assemblies to find mapper profiles
 }
Пример #10
0
        public DefaultHost(ILifetimeScope rootLifetimeScope)
        {
            _rootLifetimeScope = rootLifetimeScope;

            var intermediateScope = _rootLifetimeScope.BeginLifetimeScope(builder =>
            {
                // assemblies
                var assemblies = AutofacAssemblyStore.GetAssemblies();

                // all modules: internal class module will NOT be picked up
                foreach (var item in assemblies.SelectMany(a => a.ExportedTypes).Where(t => typeof(IModule).IsAssignableFrom(t)))
                {
                    builder.RegisterType(item)
                    .As <IModule>()
                    .InstancePerDependency();
                }
            });

            _siteLifetimeScope = intermediateScope.BeginLifetimeScope(AutofacScope.Site, builder =>
            {
                // assemblies
                var assemblies = AutofacAssemblyStore.GetAssemblies();

                // modules
                foreach (var item in intermediateScope.Resolve <IEnumerable <IModule> >())
                {
                    builder.RegisterModule(item);
                }

                // dependencies
                builder.RegisterAssemblyTypes(assemblies)
                .Where(t => typeof(IDependency).IsAssignableFrom(t) &&
                       !typeof(ISingletonDependency).IsAssignableFrom(t) &&
                       !typeof(IUnitOfWorkDependency).IsAssignableFrom(t) &&
                       !typeof(ITransientDependency).IsAssignableFrom(t) &&
                       !typeof(IEventHandler).IsAssignableFrom(t))
                .AsImplementedInterfaces()
                .InstancePerLifetimeScope()
                .EnableInterfaceInterceptors();
                builder.RegisterAssemblyTypes(assemblies)
                .Where(t => typeof(ISingletonDependency).IsAssignableFrom(t) && !typeof(IEventHandler).IsAssignableFrom(t))
                .AsImplementedInterfaces()
                .InstancePerMatchingLifetimeScope(AutofacScope.Site)
                .EnableInterfaceInterceptors();
                builder.RegisterAssemblyTypes(assemblies)
                .Where(t => typeof(IUnitOfWorkDependency).IsAssignableFrom(t) && !typeof(IEventHandler).IsAssignableFrom(t))
                .AsImplementedInterfaces()
                .InstancePerMatchingLifetimeScope(AutofacScope.Work)
                .EnableInterfaceInterceptors();
                builder.RegisterAssemblyTypes(assemblies)
                .Where(t => typeof(ITransientDependency).IsAssignableFrom(t) && !typeof(IEventHandler).IsAssignableFrom(t))
                .AsImplementedInterfaces()
                .InstancePerDependency()
                .EnableInterfaceInterceptors();

                // event handlers
                builder.RegisterAssemblyTypes(assemblies)
                .Where(t => typeof(IEventHandler).IsAssignableFrom(t))
                .ActivatorData.ConfigurationActions.Add((type, registrationBuilder) =>
                {
                    var interfaceTypes = type.GetInterfaces();
                    foreach (var interfaceType in interfaceTypes)
                    {
                        if (interfaceType.GetInterface(typeof(IEventHandler).Name) != null)
                        {
                            // register named instance for each interface, for efficient filtering inside event bus
                            // IEventHandler derived classes only
                            registrationBuilder.Named <IEventHandler>(interfaceType.Name);
                        }
                    }
                    registrationBuilder.InstancePerLifetimeScope();
                });
            });

            _hostEvents = _siteLifetimeScope.Resolve <Owned <IHostEvents> >();

            Logger = NullLogger.Instance;
        }