/// <summary> /// Get resource handler /// </summary> public IApiResourceHandler GetResourceHandler <TScope>(String resourceName) { IApiResourceHandler retVal = null; this.m_handlers.TryGetValue($"{typeof(TScope).Name}/{resourceName}", out retVal); return(retVal); }
/// <summary> /// Creates an single resource handler for a particular service /// </summary> /// <param name="resourceTypes">The type of resource handlers</param> public ResourceHandlerTool(IEnumerable <Type> resourceHandlerTypes, Type scope) { var serviceManager = ApplicationServiceContext.Current.GetService <IServiceManager>(); var tPropertyProviders = serviceManager.CreateInjectedOfAll <IApiChildResourceHandler>(); var tOperationProviders = serviceManager.CreateInjectedOfAll <IApiChildOperation>(); foreach (var t in resourceHandlerTypes.Where(t => !t.ContainsGenericParameters && !t.IsAbstract && !t.IsInterface)) { try { IApiResourceHandler rh = serviceManager.CreateInjected(t) as IApiResourceHandler; if (rh == null) { continue; // TODO: Emit a warning } if (rh.Scope == scope) { this.m_handlers.TryAdd($"{rh.Scope.Name}/{rh.ResourceName}", rh); this.m_traceSource.TraceInfo("Adding {0} to {1}", rh.ResourceName, rh.Scope); // Associated prop handler if (rh is IChainedApiResourceHandler assoc) { tPropertyProviders.Where(p => p.ParentTypes.Contains(rh.Type) || p.ParentTypes == Type.EmptyTypes).ToList().ForEach(p => assoc.AddChildResource(p)); } if (rh is IOperationalApiResourceHandler oper) { tOperationProviders.Where(p => p.ParentTypes.Contains(rh.Type) || p.ParentTypes == Type.EmptyTypes).ToList().ForEach(p => oper.AddOperation(p)); } } } catch (Exception e) { this.m_traceSource.TraceError("Error binding: {0} due to {1}", t.FullName, e); } } }