public IProvideInstance CreateProvider(Type requested, IDependencyDefinition definition, IDependencyAdapter container) { IProvideInstance valueProvider = null; if (definition.IsSingleton) { valueProvider = definition.HasSingleton ? new SingletonFactory(definition.ConcreteInstance) : new SingletonFactory(BuildFactory(requested, definition, container)); } else { valueProvider = new InstanceFactory(BuildFactory(requested, definition, container)); } return(valueProvider); }
public IProvideInstance GetProviderForPlugin(Type requested, IDependencyDefinition definition, IDependencyAdapter container) { return(Providers .ReadOrWrite( Tuple.Create(requested, definition.ConcreteType, definition.PluginName ?? ""), () => CreateProvider(requested, definition, container))); }
public Func <object> BuildFactory(Type requested, IDependencyDefinition definition, IDependencyAdapter container) { if (definition.HasDelegate) { return(BuildDelegateCall(requested, definition)); } ContainerReference = ContainerReference ?? Expression.Constant(container); ResolveMethod = ResolveMethod ?? container.GetType().GetMethod("GetInstance", new Type[] { typeof(Type) }); var genericTypeArgs = requested.IsGenericType ? requested.GetGenericArguments() : new Type[] {}; var type = genericTypeArgs.Length > 0 && definition.ConcreteType.IsGenericTypeDefinition ? definition.ConcreteType.MakeGenericType(genericTypeArgs) : definition.ConcreteType; var constructors = Reflector.GetConstructorInfo(type).OrderBy(x => x.Item2.Length).Reverse(); var constructor = constructors .FirstOrDefault(x => x.Item2.All(p => container.HasPluginFor(p.ParameterType))); var parameters = constructor .Item2 .Select(x => { var argExpr = Expression.Constant(x.ParameterType); var callExpr = Expression.Call(ContainerReference, ResolveMethod, argExpr); return(Expression.Convert(callExpr, x.ParameterType)); }); var newExpr = Expression.New(constructor.Item1, parameters); var castExpr = Expression.Convert(newExpr, typeof(object)); return(Expression.Lambda <Func <object> >(castExpr).Compile()); }
public IProvideInstance GetProviderForPlugin <TRequest>(IDependencyDefinition definition, IDependencyAdapter container) { return(GetProviderForPlugin(typeof(TRequest), definition, container)); }