/// <summary> /// 注册一个服务 /// </summary> /// <param name="service">服务对象</param> /// <param name="virtualPath">所适用的虚拟路径范围</param> public static void RegisterService(object service, string virtualPath) { if (virtualPath == null) { throw new ArgumentNullException("virtualPath"); } if (!VirtualPathUtility.IsAppRelative(virtualPath)) { throw VirtualPathHelper.VirtualPathFormatError("virtualPath"); } lock ( sync ) { servicesCache.Clear(); var serviceCollection = serviceMap[virtualPath] as ArrayList; if (serviceCollection == null) { serviceMap[virtualPath] = serviceCollection = new ArrayList(); } serviceCollection.Insert(0, service); } }
/// <summary> /// 从注册服务列表中检索服务 /// </summary> /// <param name="virtualPath">虚拟路径</param> /// <returns>该虚拟路径注册的所有服务对象</returns> private static object[] GetServicesFromServiceMap(string virtualPath) { if (virtualPath == null) { return(new object[0]); } if (!VirtualPathUtility.IsAppRelative(virtualPath)) { throw VirtualPathHelper.VirtualPathFormatError("virtualPath"); } var services = servicesCache[virtualPath] as object[]; if (services == null) { string parent = null; if (virtualPath != "~/") { parent = VirtualPathUtility.Combine(virtualPath, "../"); } servicesCache[virtualPath] = services = GetServices(virtualPath).Concat(GetServicesFromServiceMap(parent)).ToArray(); } return(services); }
/// <summary> /// 在指定虚拟路径上取消注册服务 /// </summary> /// <param name="service">要取消注册的服务对象</param> /// <param name="virtualPath">要取消注册的虚拟路径</param> /// <param name="backtracking">是否要上溯清理所有父级路径的注册,如果设置为 false 则只清理当前路径的注册</param> public static void UnregisterService(object service, string virtualPath, bool backtracking = true) { if (virtualPath == null) { throw new ArgumentNullException("virtualPath"); } if (service == null) { throw new ArgumentNullException("service"); } if (!VirtualPathUtility.IsAppRelative(virtualPath)) { throw VirtualPathHelper.VirtualPathFormatError("virtualPath"); } lock ( sync ) { servicesCache.Clear(); UnregisterCore(virtualPath, service); if (backtracking) { string parent; if (virtualPath == "~/") { parent = null; } else if (virtualPath.EndsWith("/")) { parent = VirtualPathUtility.Combine(virtualPath, "../"); } else { parent = VirtualPathUtility.GetDirectory(virtualPath); } if (parent != null) { UnregisterService(service, parent, true); } } } }
/// <summary> /// 获取指定虚拟路径所有服务对象 /// </summary> /// <typeparam name="T">服务类型</typeparam> /// <param name="virtualPath">虚拟路径</param> /// <returns>该虚拟路径注册的所有服务对象</returns> public static T[] GetServices <T>(string virtualPath) where T : class { if (!VirtualPathUtility.IsAppRelative(virtualPath)) { throw VirtualPathHelper.VirtualPathFormatError("virtualPath"); } lock ( sync ) { var services = servicesCache[virtualPath] as object[]; if (services == null) { string directory = VirtualPathUtility.GetDirectory(virtualPath); servicesCache[virtualPath] = services = GetServices(virtualPath).Concat(GetServicesFromServiceMap(directory)).ToArray(); } return(services.OfType <T>().Concat(GetServices <T>()).ToArray()); } }