예제 #1
0
        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);
        }
예제 #2
0
 public IProvideInstance GetProviderForPlugin(Type requested, IDependencyDefinition definition, IDependencyAdapter container)
 {
     return(Providers
            .ReadOrWrite(
                Tuple.Create(requested, definition.ConcreteType, definition.PluginName ?? ""),
                () => CreateProvider(requested, definition, container)));
 }
예제 #3
0
        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());
        }
예제 #4
0
 public IProvideInstance GetProviderForPlugin <TRequest>(IDependencyDefinition definition, IDependencyAdapter container)
 {
     return(GetProviderForPlugin(typeof(TRequest), definition, container));
 }