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); }
/// <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); } }
public static bool IsOk(this TaskEnding _this) { return(_this == TaskEnding.Done); }
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); }
protected virtual void InvokeDone(TaskEnding ending) { _taskState = TaskState.Done; Done(ending); }