public void ModulesConfigurationTest()
        {
            var modConf = new ModulesConfiguration();

            Assert.NotNull(modConf.Modules);
            Assert.NotNull(modConf.Shell);
        }
        /// <summary>
        /// Will select the shell with the name in the configuration
        /// </summary>
        protected void SelectShell(IEnumerable <Assembly> assemblies, ModulesConfiguration modulesConfig)
        {
            Type selectedShell;
            var  shells = assemblies.SelectMany(ass => ass.GetTypes())
                          .Where(t => typeof(IModuleShell).IsAssignableFrom(t) && t.GetCustomAttribute <ModuleShellAttribute>() != null);

            if (string.IsNullOrEmpty(modulesConfig.Shell.ShellName))
            {
                selectedShell = shells.FirstOrDefault();
            }
            else
            {
                selectedShell = shells.FirstOrDefault(shellType =>
                                                      shellType.GetCustomAttribute <ModuleShellAttribute>().Name.Equals(modulesConfig.Shell.ShellName));
            }

            if (selectedShell == null)
            {
                var fallbackShell = (FallbackShellViewModel)GlobalContainer.Resolve <IModuleShell>(FallbackShellViewModel.ShellName);
                fallbackShell.RunMode         = Name;
                fallbackShell.ConfiguredShell = modulesConfig.Shell.ShellName;

                modulesConfig.Shell.ShellName = FallbackShellViewModel.ShellName;
                return;
            }

            var shellAttr = selectedShell.GetCustomAttribute <ModuleShellAttribute>();

            modulesConfig.Shell.ShellName = shellAttr.Name;
        }
예제 #3
0
파일: Test1.cs 프로젝트: pmq20/mono_forked
        static void Main(string[] args)
        {
            // Create the application host
            object host = ApplicationHost.CreateApplicationHost(typeof(MyHost), "/", "c:\\");

            int request_count = 10;

            SimpleWorkerRequest [] requests = new SimpleWorkerRequest[request_count];

            int pos;

            for (pos = 0; pos != request_count; pos++)
            {
                requests[pos] = new SimpleWorkerRequest("test.aspx", "", Console.Out);
            }

            ModulesConfiguration.Add("syncmodule", typeof(SyncModule).AssemblyQualifiedName);
            ModulesConfiguration.Add("asyncmodule", typeof(AsyncModule).AssemblyQualifiedName);

            HandlerFactoryConfiguration.Add("get", "/", typeof(AsyncHandler).AssemblyQualifiedName);
            //HandlerFactoryConfiguration.Add("get", "/", typeof(SyncHandler).AssemblyQualifiedName);

            for (pos = 0; pos != request_count; pos++)
            {
                HttpRuntime.ProcessRequest(requests[pos]);
            }

            HttpRuntime.Close();

/*
 *                      Console.Write("Press Enter to quit.");
 *                      Console.WriteLine();
 *                      Console.ReadLine();
 */
        }
        /// <summary>
        /// Called when [modules configuration loaded].
        /// </summary>
        private void OnModulesConfigurationLoaded(object sender, ModulesConfiguration modulesConfiguration)
        {
            //set config provider
            Container.SetInstance(Current.ConfigProvider);
            Container.SetInstance(modulesConfiguration);

            RunModeReady?.Invoke(this, modulesConfiguration);
        }
예제 #5
0
        private static void RegisterModulesFromConfig(ContainerBuilder builder)
        {
            var modules = ModulesConfiguration.GetModulesFromConfiguration();

            foreach (var module in modules)
            {
                builder.RegisterModule(module);
            }
        }
예제 #6
0
        public AutoBindModule(ModulesConfiguration config)
            : base()
        {
            if (!typeof(T).IsInterface)
            {
                throw new Exception("T may be interface only");
            }

            this.config       = config;
            relevantTypes     = new List <Type>();
            necessaryType     = null;
            necessaryTypeName = String.Empty;
        }
예제 #7
0
        /// <inheritdoc />
        public override void LoadModulesConfiguration()
        {
            var modulesConfig = new ModulesConfiguration();

            SelectShell(Assemblies, modulesConfig);

            foreach (var assembly in Assemblies)
            {
                modulesConfig.Modules.AddRange(GetModuleConfigsFromAssembly(assembly, modulesConfig));
            }

            ConfigProvider = new LocalConfigProvider(ConfigManager, modulesConfig);

            RaiseModulesConfigurationLoaded(modulesConfig);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="LocalConfigProvider"/> class.
 /// </summary>
 public LocalConfigProvider(IConfigManager configManager, ModulesConfiguration modulesConfiguration)
 {
     _modulesConfiguration = modulesConfiguration;
     _configManager        = configManager;
 }
예제 #9
0
 public TextFileSourceModule(ModulesConfiguration config)
     : base()
 {
     this.config = config;
     LocalName   = "File";
 }
 public PunctuationTextProcessorModule(ModulesConfiguration config)
     : base()
 {
     LocalName = "SpacesWithPunctuation";
 }
예제 #11
0
 public ConsoleResultWriter(ModulesConfiguration config)
     : this(config.OutputStream)
 {
 }
예제 #12
0
 public TextSourceModule(ModulesConfiguration config) : base(config)
 {
 }
예제 #13
0
 public PunctuationTextProcessor(ModulesConfiguration config)
     : this()
 {
 }
예제 #14
0
 public TextFileResultWriter(ModulesConfiguration config)
     : this(config.OutputFilePath)
 {
 }
예제 #15
0
        /// <summary>
        /// Gets the module configs from assembly.
        /// </summary>
        protected IEnumerable <ModulConfig> GetModuleConfigsFromAssembly(Assembly assembly, ModulesConfiguration modulesConfiguration)
        {
            var moduleConfigs = new List <ModulConfig>();
            var modules       = assembly.GetTypes().Where(t => typeof(IClientModule).IsAssignableFrom(t)).ToList();

            foreach (var module in modules)
            {
                var att = module.GetCustomAttribute <ClientModuleAttribute>();
                if (att == null)
                {
                    continue;
                }

                var configuredModule = modulesConfiguration.Modules.FirstOrDefault(m => m.ModuleName == att.Name);
                if (configuredModule != null)
                {
                    continue;
                }

                var libraryName = module.Assembly.ManifestModule.ScopeName;

                configuredModule = new ModulConfig
                {
                    ModuleName = att.Name,
                    SortIndex  = 9999,
                    IsEnabled  = true,
                    Accesses   = new Dictionary <string, OperationAccess>()
                };

                moduleConfigs.Add(configuredModule);
            }

            return(moduleConfigs);
        }
 /// <summary>
 /// Called when the modules configuration loaded
 /// </summary>
 private void OnModulesConfigurationLoaded(object sender, ModulesConfiguration e)
 {
 }
예제 #17
0
 public SpaceTextProcessor(ModulesConfiguration config)
     : this()
 {
 }
예제 #18
0
        // инициализация

        /*
         * грузим все модули из сборки
         * выделяем источники, приемники, обработчики
         * делаем запрос с консоли, что делать
         */

        /// <summary>
        /// Инициализирует проект
        /// </summary>
        private static void Initialize()
        {
            //Настройки можно вынести как настройки приложения, так и сделать сериализуемыми
            config = new ModulesConfiguration(
                inputFilePath: System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Data", "FileSource.txt"),
                outputFilePath: System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Data", "Result.txt"),
                connectionString: String.Empty,
                outputStream: Console.Out
                );

#if version1 //Более простой вариант, но требует создания модуля связки на каждый класс
            //Ищем модули для DI контейнера.
            var modules = new List <INinjectModule>(15);

            //Также для расширяемости можно добавить загрузку сборок из внешних библиотек, не подключенных
            //к проекту

            foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
            {
                var assemblyModules = assembly.GetTypes()
                                      .Where(t => t.GetInterfaces()
                                             .Any(i => i == typeof(INamedType)))
                                      .Select(t => Activator.CreateInstance(t, new object[] { config }) as INinjectModule)
                                      .ToArray();
                modules.AddRange(assemblyModules);
            }

            //Здесь можно сделать проверку на наличие модулей с одинаковыми именами,
            //Так как в данном решении объекты создаются по имени связки

            kernel = new StandardKernel(modules.ToArray());

            //Выбираем все источники
            sourses = modules
                      .Where(m => m.GetType().GetInterfaces().Any(i => i == typeof(ISourceModule)))
                      .Select(m => (m as INamedType).LocalName)
                      .ToArray();

            //Выбираем всех писателей
            writers = modules
                      .Where(m => m.GetType().GetInterfaces().Any(i => i == typeof(IResultWriterModule)))
                      .Select(m => (m as INamedType).LocalName)
                      .ToArray();

            //Выбираем все обработчики текста
            processors = modules
                         .Where(m => m.GetType().GetInterfaces().Any(i => i == typeof(ITextProcessorModule)))
                         .Select(m => (m as INamedType).LocalName)
                         .ToArray();
#endif

#if version2 //Более сложный вариант, но добавляющий больше гибкости: достаточно просто добавить класс
            //в сборку и унаследовать его от нужного интерфейса. Но заставляет жестко
            //связывать объекты исполнители с классом конфигурации
            textSourceModule = new TextSourceModule(config);
            textSourceModule.LoadAssebliesTypes();
            resultWriterModule = new ResultWriterModule(config);
            resultWriterModule.LoadAssebliesTypes();
            textProcessorModule = new TextProcessorModule(config);
            textProcessorModule.LoadAssebliesTypes();

            sourses    = textSourceModule.AvailableTypeNames;
            writers    = resultWriterModule.AvailableTypeNames;
            processors = textProcessorModule.AvailableTypeNames;
#endif
        }
예제 #19
0
 public SpaceTextProcessor(ModulesConfiguration config)
     : base()
 {
     LocalName = "Spaces";
 }
예제 #20
0
 public ResultWriterModule(ModulesConfiguration config) : base(config)
 {
 }
 public TextFileResultWriterModule(ModulesConfiguration config)
     : base()
 {
     this.config = config;
     LocalName   = "File";
 }
예제 #22
0
 /// <summary>
 /// Raises the <see cref="LoadModulesConfigurationCompleted"/> event if someone is registered.
 /// </summary>
 protected virtual void RaiseModulesConfigurationLoaded(ModulesConfiguration e)
 {
     LoadModulesConfigurationCompleted?.Invoke(this, e);
 }
예제 #23
0
 public TextFileSource(ModulesConfiguration config)
     : this(config.InputFilePath)
 {
 }
예제 #24
0
 public ModulesConfigurationTests()
 {
     _appConfiguration = A.Fake <IConfiguration>();
     _configuration    = new ModulesConfiguration(_appConfiguration);
 }
예제 #25
0
 public TextProcessorModule(ModulesConfiguration config)
     : base(config)
 {
 }