示例#1
0
        /// <summary>
        /// Dynamically instantiates all features in a given namespaceSuffix
        /// </summary>
        /// <param name="assembly">Assembly containing the feature types</param>
        /// <param name="namespaceSuffix">Namespace containing the feature types</param>
        /// <returns>Instances of all features in the namespace with the given suffix</returns>
        public static IEnumerable <CompiledFeature> LoadFeaturesFromNamespace(Assembly assembly, string namespaceSuffix)
        {
            var loadedFeatures = new List <CompiledFeature>();

            if (assembly == null || string.IsNullOrEmpty(namespaceSuffix))
            {
                return(loadedFeatures);
            }

            var featureScope = FeatureScope.Undefined;
            var featureTypes = assembly.GetTypes().Where(t => t.Namespace != null && t.Namespace.EndsWith(namespaceSuffix));

            foreach (var featureType in featureTypes)
            {
                var featureMetadata = new CompiledFeatureMetadata
                {
                    Name      = featureType.Name,
                    ClassName = featureType.Name
                };

                try
                {
                    var loadedFeature = CompiledFeatureFactory.GetInstance(featureScope, assembly, featureType.Namespace, featureMetadata);
                    loadedFeatures.Add(loadedFeature);
                }
                catch (Exception ex)
                {
                    Logger.LogError(ex, ex.Message);
                }
            }

            return(loadedFeatures);
        }
        public void GetInstance_Throws_InvalidFeatureException_If_Type_Is_Not_A_Feature3()
        {
            var notAFeatureType = typeof(StringBuilder);
            var featureMetadata = new CompiledFeatureMetadata
            {
                Name      = "SomeName",
                ClassName = notAFeatureType.Name
            };
            var featureScope = FeatureScope.Undefined;
            var assembly     = Assembly.GetAssembly(notAFeatureType);
            var @namespace   = notAFeatureType.Namespace;

            Assert.Throws <InvalidFeatureException>(() => CompiledFeatureFactory.GetInstance(featureScope, assembly, @namespace, featureMetadata));
        }
        public void GetInstance_Returns_Feature_From_Assembly()
        {
            var featureType  = typeof(AspNetMvcFeature);
            var assembly     = Assembly.GetAssembly(featureType);
            var featureScope = FeatureScope.Project;
            var @namespace   = featureType.Namespace;

            var featureName = "FeatureName";
            var className   = nameof(AspNetMvcFeature);
            var metadata    = new CompiledFeatureMetadata
            {
                Name      = featureName,
                ClassName = className
            };

            var feature = CompiledFeatureFactory.GetInstance(featureScope, assembly, @namespace, metadata);

            Assert.NotNull(feature);
            Assert.True(feature.Name == featureName);
            Assert.True(feature.FeatureScope == featureScope);
            Assert.True(feature is AspNetMvcFeature);
        }
示例#4
0
        /// <summary>
        /// Factory method that dynamically instantiates feature classes using assembly and class metadata
        /// </summary>
        /// <param name="featureScope">The scope in which to look for this feature</param>
        /// <param name="assembly">Assembly containing the feature type</param>
        /// <param name="namespace">Namespace containing the feature type</param>
        /// <param name="featureMetadata">Metadata about the feature type</param>
        /// <returns>Instance of the specified feature</returns>
        public static CompiledFeature GetInstance(FeatureScope featureScope, Assembly assembly, string @namespace, CompiledFeatureMetadata featureMetadata)
        {
            var fullyQualifiedClassName = $"{@namespace}.{featureMetadata.ClassName}";
            var featureType             = assembly.GetType(fullyQualifiedClassName);

            if (featureType == null)
            {
                throw new ClassNotFoundException(assembly, fullyQualifiedClassName);
            }

            try
            {
                var name            = featureMetadata.Name;
                var scope           = featureScope;
                var featureInstance = GetInstance(featureType, name, scope);
                return(featureInstance);
            }
            catch (InvalidFeatureException)
            {
                throw new InvalidFeatureException(assembly, fullyQualifiedClassName);
            }
        }