private void GatherServicesAndInvokeBeforeWriteScriptsCallbacks(IScriptManagerService scriptManager, Dictionary <Type, object> services) { var allCreatedObjects = _createdObjects; while (_createdObjects.Count > 0) { var current = _createdObjects; _createdObjects = new HashSet <Tuple <object, Type> >(); foreach (var o in current.Select(x => x.Item1).OfType <IBeforeWriteScriptsCallback>()) { o.BeforeWriteScripts(scriptManager); } var newServices = GatherServices(current.Select(o => o.Item1), services); foreach (var o in newServices.OfType <IBeforeWriteScriptsCallback>()) { o.BeforeWriteScripts(scriptManager); } foreach (var o in _createdObjects) // This iteration might have caused new types to be created. In that case, add them to the set and continue the loop. { allCreatedObjects.Add(o); } } _createdObjects = allCreatedObjects; }
public void ApplyToScriptManager(IScriptManagerService scriptManager) { var services = new Dictionary <Type, object>(); GatherServicesAndInvokeBeforeWriteScriptsCallbacks(scriptManager, services); foreach (var asm in _createdObjects.Select(o => o.Item1.GetType().Assembly) .Concat(services.Values.Select(o => o.GetType().Assembly)) .Concat(_registeredClientUsableTypes.Select(t => t.Assembly)) .Distinct()) { scriptManager.RegisterClientAssembly(asm); } foreach (var svc in services.Concat(_createdObjects.Where(t => t.Item2 != null) .Select(t => new KeyValuePair <Type, object>(t.Item2, t.Item1))) .Where(svc => !scriptManager.IsClientServiceRegistered(svc.Key)) .Distinct()) { scriptManager.RegisterClientService(svc.Key, svc.Value); } }
public DefaultLesson7Provider(IContainer container, IScriptManagerService scriptManager, IRouteService routes) { _container = container; _scriptManager = scriptManager; _routes = routes; }