コード例 #1
0
        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("}");
            }
        }
コード例 #2
0
        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(";");
            }
        }