/// <summary> /// Start the storage and load the type strategies /// </summary> public void Start() { _types = ReflectionTool.GetPublicClasses <ProductType>().ToDictionary(t => t.Name, t => t); // Create type strategies foreach (var config in Config.TypeStrategies) { var strategy = StrategyFactory.CreateTypeStrategy(config); TypeStrategies[config.TargetType] = strategy; TypeConstructors[config.TargetType] = ReflectionTool.ConstructorDelegate <ProductType>(strategy.TargetType); } // Create instance strategies foreach (var config in Config.InstanceStrategies) { var strategy = StrategyFactory.CreateInstanceStrategy(config); InstanceStrategies[config.TargetType] = strategy; } // Create link strategies foreach (var config in Config.LinkStrategies) { var strategy = StrategyFactory.CreateLinkStrategy(config); LinkStrategies[config.TargetType][config.PartName] = strategy; var property = strategy.TargetType.GetProperty(config.PartName); var linkType = property.PropertyType; // Extract element type from collections if (typeof(IEnumerable <IProductPartLink>).IsAssignableFrom(linkType)) { linkType = linkType.GetGenericArguments()[0]; } // Build generic type if (linkType.IsInterface && linkType.IsGenericType) { var genericElement = linkType.GetGenericArguments()[0]; linkType = typeof(ProductPartLink <>).MakeGenericType(genericElement); } LinkConstructors[$"{config.TargetType}.{config.PartName}"] = ReflectionTool.ConstructorDelegate <IProductPartLink>(linkType); } // Create recipe strategies foreach (var config in Config.RecipeStrategies) { var strategy = StrategyFactory.CreateRecipeStrategy(config); RecipeStrategies[config.TargetType] = strategy; RecipeConstructors[config.TargetType] = ReflectionTool.ConstructorDelegate <IProductRecipe>(strategy.TargetType); } }