Beispiel #1
0
        public static IServiceProvider Setup(
            Revenj.Extensibility.Setup.IContainerBuilder builder,
            bool withAspects,
            bool externalConfiguration,
            params Action<IObjectFactoryBuilder>[] setupExternal)
        {
            var state = new SystemState();
            builder.RegisterSingleton<ISystemState>(state);
            foreach (var se in setupExternal)
                se(builder);
            var serverModels =
                (from asm in Revenj.Utility.AssemblyScanner.GetAssemblies()
                 let type = asm.GetType("SystemBoot.Configuration")
                 where type != null && type.GetMethod("Initialize") != null
                 select asm)
                .ToList();
            builder.ConfigurePatterns(_ => serverModels);
            builder.ConfigureSerialization();
            builder.ConfigureSecurity(false);
            builder.RegisterFunc<IEnumerable<Assembly>>(f => AssemblyScanner.GetAssemblies());
            builder.RegisterFunc<IEnumerable<Type>>(f => AssemblyScanner.GetAllTypes());

            var factory = builder.Build();
            factory.Resolve<IDomainModel>();//TODO: explicit model initialization
            state.IsBooting = false;
            state.Started(factory);
            return factory;
        }
        private static void SetupExtensibility(Revenj.Extensibility.Autofac.ContainerBuilder builder)
        {
            var dynamicProxy = new CastleDynamicProxyProvider();
            var aopRepository = new AspectRepository(dynamicProxy);

            var dllPlugins =
                (from key in ConfigurationManager.AppSettings.AllKeys
                 where key.StartsWith("PluginsPath", StringComparison.OrdinalIgnoreCase)
                 let path = ConfigurationManager.AppSettings[key]
                 let pathRelative = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, path)
                 let chosenPath = Directory.Exists(pathRelative) ? pathRelative : path
                 select chosenPath)
                .ToList();
            builder.RegisterInstance(new PluginsConfiguration { Directories = dllPlugins });

            builder.RegisterType<SystemInitialization>();
            builder.RegisterType<AutofacObjectFactory>().As<IObjectFactory>().SingleInstance();
            builder.RegisterType<AutofacMefProvider>().As<IExtensibilityProvider>().SingleInstance();
            builder.RegisterGeneric(typeof(PluginRepository<>)).As(typeof(IPluginRepository<>)).SingleInstance();

            builder.RegisterInstance(aopRepository).As<IAspectRegistrator, IAspectComposer, IInterceptorRegistrator>();
            builder.RegisterInstance(dynamicProxy).As<IMixinProvider, IDynamicProxyProvider>();

            if (ConfigurationManager.AppSettings["Revenj.AllowAspects"] == "true")
                builder.RegisterModule(new AspectsModule(aopRepository));
        }
 public IDbCommand CreateQuery(Revenj.Utility.ChunkedMemoryStream cms)
 {
     var writer = cms.GetWriter();
     writer.Write(Statement);
     writer.Flush();
     cms.Position = 0;
     return PostgresDatabaseQuery.NewCommand(cms, Statement, Query.Selects.Count == 1);
 }
        private static void SetupExtensibility(Revenj.Extensibility.Autofac.ContainerBuilder builder, bool withAspects, bool externalConfiguration)
        {
            var dynamicProxy = new CastleDynamicProxyProvider();
            var aopRepository = new AspectRepository(dynamicProxy);

            var dllPlugins = externalConfiguration == false ? new string[0] :
                (from key in ConfigurationManager.AppSettings.AllKeys
                 where key.StartsWith("PluginsPath", StringComparison.OrdinalIgnoreCase)
                 let path = ConfigurationManager.AppSettings[key]
                 let pathRelative = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, path)
                 let chosenPath = Directory.Exists(pathRelative) ? pathRelative : path
                 select chosenPath)
                .ToArray();

            var assemblies = Revenj.Utility.AssemblyScanner.GetAssemblies().Where(it => it.FullName.StartsWith("Revenj."));
            builder.RegisterInstance(new PluginsConfiguration { Assemblies = assemblies, Directories = dllPlugins });

            builder.RegisterType<SystemInitialization>();
            builder.RegisterType<AutofacObjectFactory>().As<IObjectFactory>().SingleInstance();
            builder.RegisterType<AutofacMefProvider>().As<IExtensibilityProvider>().SingleInstance();
            builder.RegisterGeneric(typeof(PluginRepository<>)).As(typeof(IPluginRepository<>)).SingleInstance();

            builder.RegisterInstance(aopRepository).As<IAspectRegistrator, IAspectComposer, IInterceptorRegistrator>();
            builder.RegisterInstance(dynamicProxy).As<IMixinProvider, IDynamicProxyProvider>();

            var types = AssemblyScanner.GetAllTypes();//TODO: force load everything
            if (withAspects)
            {
                foreach (var m in types)
                {
                    if (m.Assembly.FullName.StartsWith("Revenj."))
                        continue;
                    if (m.IsPublic && !m.IsAbstract && typeof(Revenj.Extensibility.Autofac.Module).IsAssignableFrom(m) && m.GetConstructor(new Type[0]) != null)
                        builder.RegisterModule((Revenj.Extensibility.Autofac.Module)Activator.CreateInstance(m));
                }
                builder.RegisterModule(new AspectsModule(aopRepository));
            }
        }
        protected override void Load(Revenj.Extensibility.Autofac.ContainerBuilder builder)
        {
            //TODO: register applications as implementation only
            builder.RegisterType<RestApplication>().As<RestApplication, IRestApplication>();
            builder.RegisterType<SoapApplication>().As<SoapApplication, ISoapApplication>();
            builder.RegisterType<CommandConverter>().As<ICommandConverter>();

            SetupExtensibility(builder);
            if (WithDatabase)
                SetupPostgres(builder);
            SetupPatterns(builder);
            SetupSerialization(builder);

            builder.RegisterType<RepositoryAuthentication>().As<IAuthentication<SecureString>, IAuthentication<string>, IAuthentication<byte[]>>();
            builder.RegisterType<RepositoryPrincipalFactory>().As<IPrincipalFactory>();
            builder.RegisterType<PermissionManager>().As<IPermissionManager>().SingleInstance();

            builder.RegisterType(typeof(ProcessingEngine)).As(typeof(IProcessingEngine)).SingleInstance();
            builder.RegisterType(typeof(ScopePool)).As(typeof(IScopePool)).SingleInstance();

            builder.RegisterType<OnContainerBuild>().As<IStartable>();

            base.Load(builder);
        }
        private static void SetupPatterns(Revenj.Extensibility.Autofac.ContainerBuilder builder)
        {
            var serverModels =
                (from asm in Revenj.Utility.AssemblyScanner.GetAssemblies()
                 let type = asm.GetType("SystemBoot.Configuration")
                 where type != null && type.GetMethod("Initialize") != null
                 select asm)
                .ToList();

            builder.RegisterGeneratedFactory<Revenj.DomainPatterns.DomainModel.Factory>();
            builder.RegisterType<Revenj.DomainPatterns.DomainModel>();
            builder.Register(c => c.Resolve<Revenj.DomainPatterns.DomainModel.Factory>()(serverModels)).As<IDomainModel>().SingleInstance();
            builder.RegisterType<DomainTypeResolver>().As<ITypeResolver>().SingleInstance();
            builder.RegisterType<ServiceLocator>().As<IServiceLocator, IServiceProvider>().InstancePerLifetimeScope();
            builder.RegisterGeneric(typeof(WeakCache<>)).As(typeof(WeakCache<>), typeof(IDataCache<>)).InstancePerLifetimeScope();
            builder.RegisterType<DomainEventSource>().As<IDomainEventSource>().InstancePerLifetimeScope();
            builder.RegisterType<DomainEventStore>().As<IDomainEventStore>().InstancePerLifetimeScope();
            builder.RegisterType<GlobalEventStore>().SingleInstance();
            builder.RegisterGeneric(typeof(SingleDomainEventSource<>)).As(typeof(IDomainEventSource<>)).InstancePerLifetimeScope();
            builder.RegisterGeneric(typeof(RegisterChangeNotifications<>)).As(typeof(IObservable<>)).SingleInstance();
            builder.RegisterType<DataContext>().As<IDataContext>().InstancePerLifetimeScope();
        }
        /*
        private static void SetupOracle(Revenj.Extensibility.Autofac.ContainerBuilder builder, string cs)
        {
            builder.RegisterInstance(new Revenj.DatabasePersistence.Oracle.ConnectionInfo(cs));
            builder.RegisterType<OracleQueryManager>().As<IDatabaseQueryManager>().InstancePerLifetimeScope();
            builder.RegisterType<OracleDatabaseQuery>().As<IOracleDatabaseQuery>();
            builder.Register(c => c.Resolve<IDatabaseQueryManager>().CreateQuery()).As<IDatabaseQuery>().InstancePerLifetimeScope();
            builder.RegisterType<OracleAdvancedQueueNotification>().As<IDataChangeNotification>().SingleInstance();

            builder.RegisterType<OracleObjectFactory>().As<IOracleConverterRepository, IOracleConverterFactory>().SingleInstance();

            builder.RegisterType<Revenj.DatabasePersistence.Oracle.QueryGeneration.QueryExecutor>();
        }
        */
        private static void SetupSerialization(Revenj.Extensibility.Autofac.ContainerBuilder builder)
        {
            builder.RegisterType<GenericDataContractResolver>().SingleInstance();
            builder.RegisterType<XmlSerialization>().As<ISerialization<XElement>>().SingleInstance();
            builder.RegisterType<GenericDeserializationBinder>().SingleInstance();
            builder.RegisterType<BinarySerialization>().As<ISerialization<byte[]>>().SingleInstance();
            builder.RegisterType<JsonSerialization>().As<ISerialization<string>, ISerialization<TextReader>>().SingleInstance();
            builder.RegisterType<ProtobufSerialization>().As<ISerialization<MemoryStream>, ISerialization<Stream>>().SingleInstance();
            builder.RegisterType<PassThroughSerialization>().As<ISerialization<object>>().SingleInstance();
            builder.RegisterType<WireSerialization>().As<IWireSerialization>().SingleInstance();
        }
        private static void SetupPostgres(Revenj.Extensibility.Autofac.ContainerBuilder builder, string cs)
        {
            builder.RegisterInstance(new Revenj.DatabasePersistence.Postgres.ConnectionInfo(cs));
            builder.RegisterType<PostgresConnectionPool>().As<IConnectionPool>().SingleInstance();
            builder.RegisterType<PostgresQueryManager>().As<IDatabaseQueryManager>().InstancePerLifetimeScope();
            builder.RegisterType<PostgresDatabaseQuery>().As<IPostgresDatabaseQuery>();
            builder.Register(c => c.Resolve<IDatabaseQueryManager>().CreateQuery()).As<IDatabaseQuery>().InstancePerLifetimeScope();
            builder.RegisterType<PostgresDatabaseNotification>().As<IDataChangeNotification, IEagerNotification>().SingleInstance();

            builder.RegisterType<PostgresObjectFactory>().As<IPostgresConverterRepository, IPostgresConverterFactory>().SingleInstance();

            builder.RegisterType<Revenj.DatabasePersistence.Postgres.QueryGeneration.QueryExecutor>();
        }
        private static void SetupPostgres(Revenj.Extensibility.Autofac.ContainerBuilder builder)
        {
            var cs = ConfigurationManager.AppSettings["Revenj.ConnectionString"] ?? ConfigurationManager.AppSettings["ConnectionString"];
            if (string.IsNullOrEmpty(cs))
                throw new ConfigurationErrorsException(@"ConnectionString is missing from configuration. Add ConnectionString to <appSettings>
            Example: <add key=""ConnectionString"" value=""server=postgres.localhost;port=5432;database=MyDatabase;user=postgres;password=123456;encoding=unicode"" />");

            builder.RegisterInstance(new Revenj.DatabasePersistence.Postgres.ConnectionInfo(cs));
            builder.RegisterType<PostgresConnectionPool>().As<IConnectionPool>().SingleInstance();
            builder.RegisterType<PostgresQueryManager>().As<IDatabaseQueryManager>().InstancePerLifetimeScope();
            builder.RegisterType<PostgresDatabaseQuery>().As<IPostgresDatabaseQuery>();
            builder.Register(c => c.Resolve<IDatabaseQueryManager>().CreateQuery()).As<IDatabaseQuery>().InstancePerLifetimeScope();
            builder.RegisterType<PostgresDatabaseNotification>().As<IDataChangeNotification, IEagerNotification>().SingleInstance();

            builder.RegisterType<PostgresObjectFactory>().As<IPostgresConverterRepository, IPostgresConverterFactory>().SingleInstance();

            builder.RegisterType<Revenj.DatabasePersistence.Postgres.QueryGeneration.QueryExecutor>();
        }
Beispiel #10
0
        private static void SetupPatterns(Revenj.Extensibility.Autofac.ContainerBuilder builder)
        {
            var serverModels =
                (from key in ConfigurationManager.AppSettings.AllKeys
                 where key.StartsWith("ServerAssembly", StringComparison.OrdinalIgnoreCase)
                 select LoadAssembly(ConfigurationManager.AppSettings[key]))
                .ToList();

            if (serverModels.Count == 0)
            {
                serverModels =
                    (from asm in Revenj.Utility.AssemblyScanner.GetAssemblies()
                     let type = asm.GetType("SystemBoot.Configuration")
                     where type != null && type.GetMethod("Initialize") != null
                     select asm)
                    .ToList();
                if (serverModels.Count == 0)
                    throw new ConfigurationErrorsException(@"Server assemblies not found. When running in compiled mode, server assemblies must be deployed with other assemblies.
            Alternatively, explicitly specify sever assembly in the config file.
            Example: <add key=""ServerAssembly_Domain"" value=""AppDomainModel.dll"" />");
            }

            builder.RegisterGeneratedFactory<Revenj.DomainPatterns.DomainModel.Factory>();
            builder.RegisterType<Revenj.DomainPatterns.DomainModel>();
            builder.Register(c => c.Resolve<Revenj.DomainPatterns.DomainModel.Factory>()(serverModels)).As<IDomainModel>().SingleInstance();
            builder.RegisterType<DomainTypeResolver>().As<ITypeResolver>().SingleInstance();
            builder.RegisterType<ServiceLocator>().As<IServiceLocator, IServiceProvider>().InstancePerLifetimeScope();
            builder.RegisterGeneric(typeof(WeakCache<>)).As(typeof(WeakCache<>), typeof(IDataCache<>)).InstancePerLifetimeScope();
            builder.RegisterType<DomainEventSource>().As<IDomainEventSource>().InstancePerLifetimeScope();
            builder.RegisterType<DomainEventStore>().As<IDomainEventStore>().InstancePerLifetimeScope();
            builder.RegisterType<GlobalEventStore>().SingleInstance();
            builder.RegisterGeneric(typeof(SingleDomainEventSource<>)).As(typeof(IDomainEventSource<>)).InstancePerLifetimeScope();
            builder.RegisterGeneric(typeof(RegisterChangeNotifications<>)).As(typeof(IObservable<>)).SingleInstance();
            builder.RegisterType<DataContext>().As<IDataContext>().InstancePerLifetimeScope();
        }
Beispiel #11
0
        protected override void Load(Revenj.Extensibility.Autofac.ContainerBuilder builder)
        {
            Configure(builder, DB);

            base.Load(builder);
        }