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. } }); }
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; }