Beispiel #1
0
        public TModule Get <TModule>()
            where TModule : IModule
        {
            IModule module;

            if (_modules.TryGetValue(typeof(TModule), out module))
            {
                return((TModule)module);
            }

            if (!_availableModules.TryGetValue(typeof(TModule), out module))
            {
                return(default(TModule));
            }

            if (_modulesInInitState.ContainsKey(module))
            {
                CoreLogger.LogError(LoggerModules.GameApplication, string.Format("module {0} is initializing and cannot be retrieved at the moment", module.GetType().Name));
                return(default(TModule));
            }

            ITask init = module.GetInitializer(this);

            if (init == null)
            {
                CoreLogger.LogDebug(LoggerModules.GameApplication, string.Format("unable to retrieve initializer for module {0} failed", module.GetType().Name));
                _failedModules[typeof(TModule)] = module;
                _availableModules.Remove(typeof(TModule));
                return(default(TModule));
            }

            _modulesInInitState[module] = init;
            TaskEnding result = init.Handle();

            _modulesInInitState.Remove(module);

            if (result.IsOk())
            {
                CoreLogger.LogDebug(LoggerModules.GameApplication, string.Format("successfully initialized module {0}", module.GetType().Name));
                _modules[typeof(TModule)] = module;
                _availableModules.Remove(typeof(TModule));
            }
            else
            {
                CoreLogger.LogDebug(LoggerModules.GameApplication, string.Format("failed to initialize module {0}", module.GetType().Name));
                _failedModules[typeof(TModule)] = module;
                _availableModules.Remove(typeof(TModule));
                return(default(TModule));
            }

            if (_started)
            {
                module.StartModule();
                CoreLogger.LogDebug(LoggerModules.GameApplication, string.Format("starting module {0}", module.GetType().Name));
            }

            return((TModule)module);
        }
Beispiel #2
0
        /// <summary>
        /// Go over all existing modules, and initialize them, if possible immediately.
        /// </summary>
        public void Init(int fromStage, int toStage)
        {
            CoreLogger.LogDebug(LoggerModules.GameApplication, string.Format("requested blocking initialization of modules stages {0} to {1}", fromStage, toStage));

            IList <KeyValuePair <Type, IModule> > modulesToRemove = new List <KeyValuePair <Type, IModule> >();

            foreach (KeyValuePair <Type, IModule> kvp in _availableModules.Where(kvp => (kvp.Value.Stage >= fromStage) && (kvp.Value.Stage <= toStage)))
            {
                IModule module = kvp.Value;

                CoreLogger.LogDebug(LoggerModules.GameApplication, string.Format("located module {0}", module.GetType().Name));
                modulesToRemove.Add(kvp);

                if (!_modules.ContainsKey(module.GetType()))
                {
                    ITask init = module.GetInitializer(this);
                    if (init != null)
                    {
                        TaskEnding result = init.Handle();
                        if (result.IsOk())
                        {
                            CoreLogger.LogDebug(LoggerModules.GameApplication, string.Format("successfully initialized module {0}", module.GetType().Name));
                            _modules[module.GetType()] = module;
                        }
                        else
                        {
                            CoreLogger.LogDebug(LoggerModules.GameApplication, string.Format("failed to initalize module {0}: {1}", module.GetType().Name, result));
                            _failedModules[module.GetType()] = module;
                        }
                    }
                    else
                    {
                        CoreLogger.LogError(LoggerModules.GameApplication, string.Format("failed to retrieve initializer for module {0}", module.GetType().Name));
                        _failedModules[module.GetType()] = module;
                    }
                }
            }

            foreach (KeyValuePair <Type, IModule> toRemove in modulesToRemove)
            {
                _availableModules.Remove(toRemove);
            }
        }
Beispiel #3
0
 public static bool IsOk(this TaskEnding _this)
 {
     return(_this == TaskEnding.Done);
 }
Beispiel #4
0
        IEnumerator ActivateServiceProvider(Type serviceType, System.Action <IService> handler)
        {
            List <ProviderWithPriority> dormantProviders = _dormantProviders.Where(p => p.Provider.GetType().GetInterfaces().Contains(serviceType)).ToList();

            dormantProviders.Sort((p1, p2) => p1.Priority.CompareTo(p2.Priority));

            foreach (IService dormantProvider in dormantProviders.Select(p => p.Provider))
            {
                IService   candidate  = dormantProvider;
                ITask      task       = candidate.GetInitializer(this);
                TaskEnding initResult = default(TaskEnding);
                bool       initDone   = false;

                task.Start(result => {
                    initResult = result;
                    initDone   = true;
                });

                while (!initDone)
                {
                    yield return(null);
                }

                if (initResult.IsOk())
                {
                    CoreLogger.LogDebug(_loggerModule, string.Format("successfully iniialized provider {0} for service {1}", dormantProvider.GetType().Name, serviceType.Name));
                    _serviceProviders[serviceType] = dormantProvider;
                    _dormantProviders.Remove(_dormantProviders.First(p => p.Provider == dormantProvider));
                    _activeProviders.Add(dormantProvider);
                    _unprovidedServices.Remove(serviceType);
                    handler(candidate);
                    yield break;
                }
                else
                {
                    CoreLogger.LogDebug(_loggerModule, string.Format("failed to initalize provider {0} for service {1}", dormantProvider.GetType().Name, serviceType.Name));
                    _dormantProviders.Remove(_dormantProviders.First(p => p.Provider == dormantProvider));
                    _failedProviders.Add(dormantProvider);
                }
            }

            foreach (KeyValuePair <Type, System.Func <IService> > kvp in _providerFactories)
            {
                if (kvp.Key.GetInterfaces().Contains(serviceType))
                {
                    IService provider = kvp.Value();
                    if (provider != null)
                    {
                        ITask      task       = provider.GetInitializer(this);
                        TaskEnding initResult = new TaskEnding();
                        bool       initDone   = false;

                        task.Start(result => {
                            initResult = result;
                            initDone   = true;
                        });

                        while (!initDone)
                        {
                            yield return(null);
                        }

                        if (initResult.IsOk())
                        {
                            CoreLogger.LogDebug(_loggerModule, string.Format("successfully iniialized provider {0} for service {1}", provider.GetType().Name, serviceType.Name));
                            _serviceProviders[serviceType] = provider;
                            _activeProviders.Add(provider);
                            _unprovidedServices.Remove(serviceType);
                            handler(provider);
                            yield break;
                        }
                        else
                        {
                            CoreLogger.LogDebug(_loggerModule, string.Format("failed to initalize provider for service {0}", serviceType.Name));
                        }
                    }
                }
            }

            handler(null);
        }
Beispiel #5
0
        protected virtual void InvokeDone(TaskEnding ending)
        {
            _taskState = TaskState.Done;

            Done(ending);
        }