/// <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); } }
/// <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; }
/// <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); }
/// <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); } }