internal void Instantiate(ContainerService.Builder builder) { LifestyleAttribute lifestyle; if (builder.Type.IsSimpleType()) builder.SetError("can't create simple type"); else if (builder.Type == typeof (IContainer)) builder.AddInstance(this, false); else if (builder.Configuration.ImplementationAssigned) builder.AddInstance(builder.Configuration.Implementation, builder.Configuration.ContainerOwnsInstance); else if (builder.Configuration.Factory != null) builder.CreateInstanceBy(() => builder.Configuration.Factory(this), builder.Configuration.ContainerOwnsInstance); else if (builder.Configuration.FactoryWithTarget != null) { if (!builder.Context.AnalizeDependenciesOnly) { var previousService = builder.Context.GetPreviousBuilder(); var target = previousService == null ? null : previousService.Type; builder.CreateInstanceBy(() => builder.Configuration.FactoryWithTarget(this, target), builder.Configuration.ContainerOwnsInstance); } } else if (builder.Type.IsValueType) builder.SetError("can't create value type"); else if (builder.Type.IsGenericType && builder.Type.ContainsGenericParameters) builder.SetError("can't create open generic"); else if (!builder.CreateNew && builder.Type.TryGetCustomAttribute(out lifestyle) && lifestyle.Lifestyle == Lifestyle.PerRequest) { const string messageFormat = "service [{0}] with PerRequest lifestyle can't be resolved, use Func<{0}> instead"; builder.SetError(string.Format(messageFormat, builder.Type.FormatName())); } else if (builder.Type.IsAbstract) InstantiateInterface(builder); else InstantiateImplementation(builder); if (builder.Configuration.InstanceFilter != null) { var filteredOutCount = builder.FilterInstances(builder.Configuration.InstanceFilter); if (filteredOutCount > 0) builder.SetComment("instance filter"); } }