private void RegisterProvider(Type bindedType, Provider provider) { try { providersMap.Add(bindedType, provider); } catch (ArgumentException e) { throw new DuplicateBindingException(bindedType.FullName, provider.ProvidedType.FullName, providersMap[bindedType].ImplementedType.FullName); } }
private void PrepareInstantation(Type type, Provider provider) { circularDependencyLockedTypes.Add(type); InitializeDependencies(provider); circularDependencyLockedTypes.Remove(type); }
private void InitializeDependencies(Provider provider) { for (int i=0; i < provider.Dependencies.Length; i++) { provider.Dependencies[i] = GetDependency(provider.DependencyTypes[i]); } }
private void InitializeAfterInstantiation(Provider provider, object dependency) { provider.IsInitialized = true; InitializeDependencyFields(dependency); ProxyInterceptor changeProxyInterceptorTarget; if (proxies.TryGetValue(provider.ProvidedType, out changeProxyInterceptorTarget)) { changeProxyInterceptorTarget.Initialize(dependency); } BroadcastDependencyInitialization(dependency); }
private void CreateDynamicProvider(Type type, out Provider provider) { Type providedType = type.GetGenericArguments()[0]; ImplementedBy implementedBy = providedType.GetTypeAttribute<ImplementedBy>(); Type implementedType = (implementedBy == null) ? providedType : implementedBy.ImplementedType; Type dynamicProviderType = typeof(DynamicProvider<>).MakeGenericType(providedType); providersMap.Add(type, provider = (Provider) dynamicProviderType.New( providedType, implementedType, GetDependencyTypes(implementedType) )); }
private object CreateDependency(Type type, Provider provider) { if (!provider.IsInitialized) { PrepareInstantation(type, provider); } object dependency = provider.Provide(); if (!provider.IsInitialized || provider is NoScopeProvider) { InitializeAfterInstantiation(provider, dependency); } return dependency; }