Example #1
0
        /// <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);
            }
        }