/// <summary> /// Initializes a new instance of the <see cref="IxHost"/> class. /// This is first build phase. Second phase performed by <see cref="Initialize"/>. /// </summary> public IxHost() { _argumentProvider = new IxArgumentProvider(this); // TODO: Load priorities from configs. InstanceFactoryBuilder.Add(ExistingInstanceRawFactoryBuilder, 100); InstanceFactoryBuilder.Add(ClassInstanceFactoryBuilder, 200); InstanceFactoryBuilder.Add(DelegateInstanceBuilder, 300); VisibilityFilterBuilder.Add(StdVisibilityFilterBuilder, 100); ProviderNodeBuilder.Add(StdProviderConfigDefaultsSetter, 100); ProviderNodeBuilder.Add(ScopeBuilder, 200); ProviderNodeBuilder.Add(SingletonProviderBuilder, 300); ProviderNodeBuilder.Add(PerResolveProviderBuilder, 400); ScopeBinderBuilder.Add(RegistrationScopeBinderBuilder, 100); DisposeHandlerBuilder.Add(DisposableDisposeHandlerBuilder, 100); DisposeHandlerBuilder.Add(AsyncDisposableDisposeHandlerBuilder, 200); ResolveHandler.Add(SelfResolveInterceptor, 80); ResolveHandler.Add(ResolverResolveInterceptor, 100); ResolveHandler.Add(DirectCycleResolveInterceptor, 150); ResolveHandler.Add(SelfToChildrenResolver, 200); ResolveHandler.Add(StdResolveInterceptor, 300); ResolveHandler.Add(ResolveContextResolveInterceptor, 400); }
/// <summary> /// Build instantiator that will produce this registration's instance. /// </summary> public void Compile() { if (InstanceFactory == null) { IInstanceFactory factory; // Check if we have previously built this factory. If so, reuse that to save resource. if (_instanceFactories.TryGetValue(RegisteredType, out factory)) { InstanceFactory = factory; } else { // We have not previously build this factory, so build for the first time and cache. // This is a resource intensive operation. InstanceFactory = InstanceFactoryBuilder.BuildInstanceFactory(); // Add to cache. _instanceFactories.Add(RegisteredType, InstanceFactory); } } }