private void AddServiceBindings([NotNull] StringBuilder moduleClassContents, [NotNull] BindingConfigurationForFile serviceElement, [NotNull] IDynamicAssemblyBuilder dynamicAssemblyBuilder) { if (serviceElement.RegisterIfNotRegistered) { moduleClassContents.AppendLine($"if (!Kernel.GetBindings(typeof({serviceElement.ServiceType.GetTypeNameInCSharpClass()})).Any())"); moduleClassContents.AppendLine("{"); } foreach (var serviceImplementation in serviceElement.Implementations) { moduleClassContents.Append($"Bind<{serviceElement.ServiceType.GetTypeNameInCSharpClass()}>()"); ITypeBasedBindingImplementationConfigurationForFile typeBasedBindingImplementationConfigurationForFile = null; if (serviceImplementation is ITypeBasedBindingImplementationConfigurationForFile) { typeBasedBindingImplementationConfigurationForFile = (ITypeBasedBindingImplementationConfigurationForFile)serviceImplementation; if (typeBasedBindingImplementationConfigurationForFile.Parameters == null) { if (serviceElement.IsSelfBoundService) { moduleClassContents.Append(".ToSelf()"); } else { moduleClassContents.Append($".To<{typeBasedBindingImplementationConfigurationForFile.ImplementationType.GetTypeNameInCSharpClass()}>()"); } } else { moduleClassContents.Append($".ToMethod(context => new {typeBasedBindingImplementationConfigurationForFile.ImplementationType.GetTypeNameInCSharpClass()}("); for (var i = 0; i < typeBasedBindingImplementationConfigurationForFile.Parameters.Length; ++i) { if (i > 0) { moduleClassContents.Append(", "); } var parameter = typeBasedBindingImplementationConfigurationForFile.Parameters[i]; moduleClassContents.Append(parameter.GenerateValueCSharp( //(serviceType) => $"({serviceType.FullName})context.Kernel.GetService(typeof({serviceType.FullName}))", dynamicAssemblyBuilder)); } moduleClassContents.Append("))"); } } else if (serviceImplementation is ValueBasedBindingImplementationConfigurationForFile valueBasedBindingImplementationConfigurationForFile) { moduleClassContents.Append($".ToMethod(context => {valueBasedBindingImplementationConfigurationForFile.ValueInitializer.GenerateValueCSharp(dynamicAssemblyBuilder)})"); } else if (serviceImplementation is IServiceToProxyBindingImplementationConfigurationForFile serviceToProxyBindingImplementationConfigurationForFile) { moduleClassContents.AppendFormat(".ToMethod(context => ({0})context.Kernel.GetService(typeof({0})))", serviceImplementation.ImplementationType.GetTypeNameInCSharpClass()); } // Add WhenInjected code as in example below switch (serviceImplementation.ConditionalInjectionType) { case ConditionalInjectionType.None: // No conditional injection. break; case ConditionalInjectionType.WhenInjectedInto: moduleClassContents.Append($".WhenInjectedInto<{serviceImplementation.WhenInjectedIntoType.GetTypeNameInCSharpClass()}>()"); break; case ConditionalInjectionType.WhenInjectedExactlyInto: moduleClassContents.Append($".WhenInjectedExactlyInto<{serviceImplementation.WhenInjectedIntoType.GetTypeNameInCSharpClass()}>()"); break; default: throw new UnsupportedEnumValueException(serviceImplementation.ConditionalInjectionType); } // Add resolution moduleClassContents.Append("."); switch (serviceImplementation.ResolutionScope) { case DiResolutionScope.Singleton: moduleClassContents.Append("InSingletonScope()"); break; case DiResolutionScope.Transient: moduleClassContents.Append("InTransientScope()"); break; case DiResolutionScope.ScopeLifetime: moduleClassContents.Append("InScope(context => _diContainer.CurrentLifeTimeScope)"); break; // Thread scope is not supported by Autofac, and therefore not used in Ninject as well. //case DiResolutionScope.Thread: // moduleClassContents.Append("InThreadScope()"); // break; default: throw new UnsupportedResolutionScopeException(serviceImplementation); } // Add injected properties if (typeBasedBindingImplementationConfigurationForFile != null) { if (typeBasedBindingImplementationConfigurationForFile.InjectedProperties?.Any() ?? false) { moduleClassContents.AppendLine($".OnActivation<{typeBasedBindingImplementationConfigurationForFile.ImplementationType.GetTypeNameInCSharpClass()}>(activatedObject =>"); moduleClassContents.AppendLine("{"); foreach (var injectedProperty in typeBasedBindingImplementationConfigurationForFile.InjectedProperties) { moduleClassContents.Append($"activatedObject.{injectedProperty.Name}="); moduleClassContents.Append(injectedProperty.GenerateValueCSharp(//(serviceType) => $"_diContainer.Resolve<{serviceType.FullName}>()", dynamicAssemblyBuilder)); moduleClassContents.Append(";"); moduleClassContents.AppendLine(); } moduleClassContents.Append("})"); } } moduleClassContents.AppendLine(";"); } if (serviceElement.RegisterIfNotRegistered) { moduleClassContents.AppendLine("}"); } }
private void AddServiceBindings([NotNull] StringBuilder moduleClassContents, [NotNull] BindingConfigurationForFile serviceElement, [NotNull] IDynamicAssemblyBuilder dynamicAssemblyBuilder) { foreach (var serviceImplementation in serviceElement.Implementations) { moduleClassContents.Append("builder."); ITypeBasedBindingImplementationConfigurationForFile typeBasedBindingImplementationConfigurationForFile = null; if (serviceImplementation is ITypeBasedBindingImplementationConfigurationForFile) { typeBasedBindingImplementationConfigurationForFile = (ITypeBasedBindingImplementationConfigurationForFile)serviceImplementation; if (typeBasedBindingImplementationConfigurationForFile.Parameters == null) { moduleClassContents.Append($"RegisterType<{typeBasedBindingImplementationConfigurationForFile.ImplementationType.GetTypeNameInCSharpClass()}>()"); } else { moduleClassContents.Append($"Register(context => new {typeBasedBindingImplementationConfigurationForFile.ImplementationType.GetTypeNameInCSharpClass()}("); for (var i = 0; i < typeBasedBindingImplementationConfigurationForFile.Parameters.Length; ++i) { if (i > 0) { moduleClassContents.Append(", "); } var parameter = typeBasedBindingImplementationConfigurationForFile.Parameters[i]; moduleClassContents.Append(parameter.GenerateValueCSharp(dynamicAssemblyBuilder)); } moduleClassContents.Append("))"); } } else if (serviceImplementation is IValueBasedBindingImplementationConfigurationForFile valueBasedBindingImplementationConfigurationForFile) { moduleClassContents.Append($"Register(context => {valueBasedBindingImplementationConfigurationForFile.ValueInitializer.GenerateValueCSharp(dynamicAssemblyBuilder)})"); } else if (serviceImplementation is IServiceToProxyBindingImplementationConfigurationForFile serviceToProxyBindingImplementationConfigurationForFile) { moduleClassContents.AppendFormat("Register(context => context.Resolve<{0}>())", serviceImplementation.ImplementationType.GetTypeNameInCSharpClass()); } // Add service if (serviceElement.IsSelfBoundService) { moduleClassContents.Append(".AsSelf()"); } else { moduleClassContents.Append($".As<{serviceElement.ServiceType.GetTypeNameInCSharpClass()}>()"); } if (serviceElement.RegisterIfNotRegistered) { moduleClassContents.Append($".IfNotRegistered(typeof({serviceElement.ServiceType.GetTypeNameInCSharpClass()}))"); } // Add resolution moduleClassContents.Append("."); switch (serviceImplementation.ResolutionScope) { case DiResolutionScope.Singleton: moduleClassContents.Append("SingleInstance()"); break; case DiResolutionScope.Transient: moduleClassContents.Append("InstancePerDependency()"); break; case DiResolutionScope.ScopeLifetime: moduleClassContents.Append("InstancePerLifetimeScope()"); break; default: throw new UnsupportedResolutionScopeException(serviceImplementation); } // Add injected properties if (typeBasedBindingImplementationConfigurationForFile != null) { if (typeBasedBindingImplementationConfigurationForFile.InjectedProperties?.Any() ?? false) { moduleClassContents.AppendLine(".OnActivated(e =>"); moduleClassContents.AppendLine("{"); foreach (var injectedProperty in typeBasedBindingImplementationConfigurationForFile.InjectedProperties) { moduleClassContents.Append($"e.Instance.{injectedProperty.Name}="); moduleClassContents.Append(injectedProperty.GenerateValueCSharp( //(serviceType) => $"e.Context.Resolve<{serviceType.FullName}>()", dynamicAssemblyBuilder)); moduleClassContents.Append(";"); moduleClassContents.AppendLine(); } moduleClassContents.Append("})"); } } moduleClassContents.AppendLine(";"); } }