bool CanHandle(ObjectRequestedEventArgs args, out OpenGenericRegistrationData registrationData, out Type[] genericArgs) { genericArgs = null; registrationData = null; var contractType = args.ContractType; if (!contractType.IsGenericType) { return(false); } var openGenericContractType = contractType.GetGenericTypeDefinition(); if (openGenericContractType == null) { throw new ImpossibleException(); } if (!_openContract2OpenConcrete.TryGetValue(openGenericContractType, out registrationData)) { return(false); } // check the generic constraints??? genericArgs = contractType.GetGenericArguments(); return(true); }
bool HandleObjectBuilderRequest(ObjectRequestedEventArgs args) { ObjectBuilderRequested.Invoke(args); if (!args.Handled) { return(false); } args.CommitRegistrations(); return(true); }
public void OnObjectRequested(ObjectRequestedEventArgs args) { Type[] genericArgs; OpenGenericRegistrationData registrationData; if (!CanHandle(args, out registrationData, out genericArgs)) { return; } RegisterNewService(args, registrationData, genericArgs); }
bool TryGetCore(Type contract, IInjectionTargetInfo targetInfo, out ObjectBuilderGroup group, out List <ObjectBuilder> builders) { var key = GetKey(contract); _operationLock.EnterReadLock(); try { if (_key2Groups.TryGetValue(key, out group)) { builders = targetInfo != null ? group.GetAllValid(targetInfo) : group.GetAllValid(); if (builders != null) { return(true); } } } finally { _operationLock.ExitReadLock(); } var args = new ObjectRequestedEventArgs(_kernel, contract, targetInfo); if (!HandleObjectBuilderRequest(args)) { builders = null; return(false); } _operationLock.EnterReadLock(); try { if (group == null && !_key2Groups.TryGetValue(key, out group)) { builders = null; return(false); } builders = targetInfo != null ? group.GetAllValid(targetInfo) : group.GetAllValid(); return(builders != null); } finally { _operationLock.ExitReadLock(); } }
ObjectBuilderState TryGetCore(Type contract, IInjectionTargetInfo targetInfo, out ObjectBuilderGroup group, out ObjectBuilder builder) { var result = ObjectBuilderState.Unregistered; var key = GetKey(contract); _operationLock.EnterReadLock(); try { if (_key2Groups.TryGetValue(key, out group)) { result = targetInfo != null ? group.TryGetFirstValid(targetInfo, out builder) : group.TryGetFirstValid(out builder); if (result == ObjectBuilderState.Normal) { return(result); } } } finally { _operationLock.ExitReadLock(); } var args = new ObjectRequestedEventArgs(_kernel, contract, targetInfo); if (!HandleObjectBuilderRequest(args)) { builder = null; return(result); } _operationLock.EnterReadLock(); try { if (group == null && !_key2Groups.TryGetValue(key, out group)) { builder = null; return(result); } return(targetInfo != null ? group.TryGetFirstValid(targetInfo, out builder) : group.TryGetFirstValid(out builder)); } finally { _operationLock.ExitReadLock(); } }
static RegistrationProvider CreateRegistrationProvider(ObjectRequestedEventArgs args, OpenGenericRegistrationData registrationData, Type[] genericArgs) { var registrationProviderType = typeof(ReflectionOrEmitRegistrationProvider <>).MakeGenericType(args.ContractType); TypedRegistrationProvider provider; try { var objProvider = Activator.CreateInstance(registrationProviderType, args.Kernel); provider = objProvider as TypedRegistrationProvider; if (provider == null) { throw new ImpossibleException(); } } catch (TargetInvocationException ex) { throw ex.InnerException; } provider.ActivatorKind = registrationData.ActivatorKind; provider.ContractType = registrationData.OpenGenericContractType.MakeGenericType(genericArgs); provider.ConcreteType = registrationData.OpenGenericConcreteType.MakeGenericType(genericArgs); if (registrationData.ConstructorSelector != null) { provider.ConstructorSelector = registrationData.ConstructorSelector; } if (registrationData.ConfiguredParameters != null) { provider.ConfiguredParameters = registrationData.ConfiguredParameters; } if (registrationData.LifetimeProvider != null) { provider.LifetimeProvider = registrationData.LifetimeProvider; } return(provider); }
static void RegisterNewService(ObjectRequestedEventArgs args, OpenGenericRegistrationData registrationData, Type[] genericArgs) { var provider = CreateRegistrationProvider(args, registrationData, genericArgs); args.Register(provider); }