private void addConcretionsThatCouldBeClosed(Type @interface, GenericFamilyExpression expression)
 {
     _concretions.Where(x => x.IsOpenGeneric())
         .Where(x => x.CouldCloseTo(@interface))
         .Each(type =>
         {
             try
             {
                 expression.Add(
                     type.MakeGenericType(@interface.GetGenericArguments()));
             }
             catch (Exception)
             {
                 // Because I'm too lazy to fight with the bleeping type constraints to "know"
                 // if it's possible to make the generic type and this is just easier.
             }
         });
 }
Exemplo n.º 2
0
 private static void Use(GenericFamilyExpression expression, ServiceDescriptor descriptor)
 {
     if (descriptor.ImplementationFactory != null)
     {
         expression.Use(Guid.NewGuid().ToString(), context => { return descriptor.ImplementationFactory(context.GetInstance<IServiceProvider>()); });
     }
     else if (descriptor.ImplementationInstance != null)
     {
         expression.Use(descriptor.ImplementationInstance);
     }
     else if (descriptor.ImplementationType != null)
     {
         expression.Use(descriptor.ImplementationType);
     }
     else
     {
         throw new InvalidOperationException("IServiceDescriptor is invalid");
     }
 }
        /*private static ConfiguredInstance ApplyResolver(GenericFamilyExpression builder, StaticResolver resolver)
        {
            return builder.Add(resolver.Target);
        }

        private static ObjectInstance ApplyResolver(GenericFamilyExpression builder, InstanceResolver resolver)
        {
            return builder.Add(resolver.Instance);
        }

        private static LambdaInstance<object> ApplyResolver(GenericFamilyExpression builder, DynamicResolver resolver)
        {
            return builder.Add(c => resolver.FactoryFunc());
        }*/
        private static GenericFamilyExpression ApplyLifestyleSingle(GenericFamilyExpression registration, Lifestyle lifestyle)
        {
            if (lifestyle.Name == Lifestyle.Singleton.Name)
                return registration.Singleton();

            if (lifestyle.Name == Lifestyle.Transient.Name)
                return registration.LifecycleIs(new TransientLifecycle());

            if (lifestyle.Name == Lifestyle.PerWebRequest.Name)
                return registration.LifecycleIs(new UniquePerRequestLifecycle());

            if (lifestyle.Name == Lifestyle.Unmanaged.Name)
                return registration;

            if (lifestyle.Name == Lifestyle.ProviderDefault.Name)
                return registration;

            if (lifestyle.Name == Lifestyle.Default.Name)
                return registration.Singleton();

            throw new ArgumentException(string.Format("Unknown lifestyle : {0}", lifestyle), "lifestyle");
        }
        //todo: very weirdly, after updating StructureMap to version 3, double dispatch via dynamic not works anymore(http://stackoverflow.com/questions/27011810/mystery-with-dynamic-type-double-dispatch)
        private static object ApplyResolver(GenericFamilyExpression builder, IImplementationResolver resolver)
        {
            if (resolver is StaticResolver)
                return builder.Add(((StaticResolver)resolver).Target);
               if (resolver is InstanceResolver)
                return builder.Add(((InstanceResolver)resolver).Instance);
               if (resolver is DynamicResolver)
                return builder.Add(c => ((DynamicResolver)resolver).FactoryFunc());

            Assumes.Fail("Unsupported IImplementationResolver implementation");
               return null;
        }