public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string) { Udi udi; if (UdiParser.TryParse((string)value, out udi)) { return(udi); } } return(base.ConvertFrom(context, culture, value)); }
/// <summary> /// Scan for deploy <see cref="IServiceConnector"/> in assemblies for known UDI types. /// </summary> /// <param name="typeLoader"></param> public static void ScanDeployServiceConnectorsForUdiTypes(TypeLoader typeLoader) { if (typeLoader is null) { throw new ArgumentNullException(nameof(typeLoader)); } if (_scanned) { return; } lock (ScanLocker) { // Scan for unknown UDI types // there is no way we can get the "registered" service connectors, as registration // happens in Deploy, not in Core, and the Udi class belongs to Core - therefore, we // just pick every service connectors - just making sure that not two of them // would register the same entity type, with different udi types (would not make // much sense anyways) var connectors = typeLoader.GetTypes <IServiceConnector>(); var result = new Dictionary <string, UdiType>(); foreach (var connector in connectors) { var attrs = connector.GetCustomAttributes <UdiDefinitionAttribute>(false); foreach (var attr in attrs) { if (result.TryGetValue(attr.EntityType, out var udiType) && udiType != attr.UdiType) { throw new Exception(string.Format("Entity type \"{0}\" is declared by more than one IServiceConnector, with different UdiTypes.", attr.EntityType)); } result[attr.EntityType] = attr.UdiType; } } // merge these into the known list foreach (var item in result) { UdiParser.RegisterUdiType(item.Key, item.Value); } _scanned = true; } }
/// <summary> /// Registers a single <see cref="IServiceConnector"/> to add it's UDI type. /// </summary> /// <typeparam name="T"></typeparam> public static void RegisterServiceConnector <T>() where T : IServiceConnector { var result = new Dictionary <string, UdiType>(); var connector = typeof(T); var attrs = connector.GetCustomAttributes <UdiDefinitionAttribute>(false); foreach (var attr in attrs) { if (result.TryGetValue(attr.EntityType, out var udiType) && udiType != attr.UdiType) { throw new Exception(string.Format("Entity type \"{0}\" is declared by more than one IServiceConnector, with different UdiTypes.", attr.EntityType)); } result[attr.EntityType] = attr.UdiType; } // merge these into the known list foreach (var item in result) { UdiParser.RegisterUdiType(item.Key, item.Value); } }
/// <summary> /// Creates a root Udi for an entity type. /// </summary> /// <param name="entityType">The entity type.</param> /// <returns>The root Udi for the entity type.</returns> public static Udi Create(string entityType) { return(UdiParser.GetRootUdi(entityType)); }