Exemplo n.º 1
0
        /// <summary>
        /// Emits the instructions that introduce the <see cref="IContainerPlugin"/> instances to the current <see cref="IMicroContainer"/> instance.
        /// </summary>
        /// <param name="module">The target module.</param>
        /// <param name="dependencyContainer">The <see cref="IDependencyContainer"/> instance that contains the services that will be instantiated by compiled container.</param>
        /// <param name="il">The current <see cref="ILProcessor"/> instance that points to the current method body.</param>
        private void InitializeContainerPlugins(ModuleDefinition module, IDependencyContainer dependencyContainer, ILProcessor il)
        {
            var pluginDependencies = new List <IDependency>(dependencyContainer.Dependencies);

            Predicate <IDependency> predicate = dependency =>
            {
                if (dependency.ServiceType != typeof(IContainerPlugin))
                {
                    return(false);
                }

                var matches   = dependencyContainer.GetImplementations(dependency, false);
                var matchList = new List <IImplementation>(matches);

                return(matchList.Count > 0);
            };

            pluginDependencies = pluginDependencies.FindAll(predicate);

            var getTypeFromHandleMethod = typeof(System.Type).GetMethod("GetTypeFromHandle", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);
            var getTypeFromHandle       = module.Import(getTypeFromHandleMethod);
            var getInstanceMethod       = module.ImportMethod <IMicroContainer>("GetInstance");

            foreach (var currentDependency in pluginDependencies)
            {
                var currentType = module.Import(currentDependency.ServiceType);
                var serviceName = currentDependency.ServiceName;

                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldtoken, currentType);
                il.Emit(OpCodes.Call, getTypeFromHandle);

                var loadString = serviceName == null
                                     ? il.Create(OpCodes.Ldnull)
                                     : il.Create(OpCodes.Ldstr, serviceName);

                il.Append(loadString);

                il.Emit(OpCodes.Callvirt, getInstanceMethod);
                il.Emit(OpCodes.Pop);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Gets the list of available services from the given dependency container.
        /// </summary>
        /// <param name="dependencyContainer">The container that holds the application dependencies.</param>
        /// <returns>The service map.</returns>
        public IDictionary<IDependency, IImplementation> GetAvailableServices(IDependencyContainer dependencyContainer)
        {
            var serviceMap = new Dictionary<IDependency, IImplementation>();

            var dependencies = dependencyContainer.Dependencies;
            foreach (var dependency in dependencies)
            {
                var implementations = dependencyContainer.GetImplementations(dependency, false);

                var concreteTypes = new List<IImplementation>(implementations);

                var implementation = concreteTypes.Count > 0 ? concreteTypes[0] : null;
                if (implementation == null)
                    continue;

                serviceMap[dependency] = implementation;
            }

            return serviceMap;
        }
Exemplo n.º 3
0
        /// <summary>
        /// Gets the list of available services from the given dependency container.
        /// </summary>
        /// <param name="dependencyContainer">The container that holds the application dependencies.</param>
        /// <returns>The service map.</returns>
        public IDictionary <IDependency, IImplementation> GetAvailableServices(IDependencyContainer dependencyContainer)
        {
            var serviceMap = new Dictionary <IDependency, IImplementation>();

            var dependencies = dependencyContainer.Dependencies;

            foreach (var dependency in dependencies)
            {
                var implementations = dependencyContainer.GetImplementations(dependency, false);

                var concreteTypes = new List <IImplementation>(implementations);

                var implementation = concreteTypes.Count > 0 ? concreteTypes[0] : null;
                if (implementation == null)
                {
                    continue;
                }

                serviceMap[dependency] = implementation;
            }

            return(serviceMap);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Emits the instructions that introduce the <see cref="IContainerPlugin"/> instances to the current <see cref="IMicroContainer"/> instance.
        /// </summary>
        /// <param name="module">The target module.</param>
        /// <param name="dependencyContainer">The <see cref="IDependencyContainer"/> instance that contains the services that will be instantiated by compiled container.</param>
        /// <param name="il">The current <see cref="ILProcessor"/> instance that points to the current method body.</param>
        private void InitializeContainerPlugins(ModuleDefinition module, IDependencyContainer dependencyContainer, ILProcessor il)
        {
            var pluginDependencies = new List<IDependency>(dependencyContainer.Dependencies);

            Predicate<IDependency> predicate = dependency =>
                                                   {
                                                       if (dependency.ServiceType != typeof(IContainerPlugin))
                                                           return false;

                                                       var matches = dependencyContainer.GetImplementations(dependency, false);
                                                       var matchList = new List<IImplementation>(matches);

                                                       return matchList.Count > 0;
                                                   };

            pluginDependencies = pluginDependencies.FindAll(predicate);

            var getTypeFromHandleMethod = typeof(System.Type).GetMethod("GetTypeFromHandle", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);
            var getTypeFromHandle = module.Import(getTypeFromHandleMethod);
            var getInstanceMethod = module.ImportMethod<IMicroContainer>("GetInstance");
            foreach (var currentDependency in pluginDependencies)
            {
                var currentType = module.Import(currentDependency.ServiceType);
                var serviceName = currentDependency.ServiceName;

                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldtoken, currentType);
                il.Emit(OpCodes.Call, getTypeFromHandle);

                var loadString = serviceName == null
                                     ? il.Create(OpCodes.Ldnull)
                                     : il.Create(OpCodes.Ldstr, serviceName);
                il.Append(loadString);

                il.Emit(OpCodes.Callvirt, getInstanceMethod);
                il.Emit(OpCodes.Pop);
            }
        }