private void CheckForMetadataOverride(string key, TemplateRegistrationMetadata metadata) { if (false == _metadataMap.ContainsKey(key)) { return; } TemplateRegistrationMetadata oldMetadata = _metadataMap[key]; oldMetadata.OverriddenBy = metadata; oldMetadata.ShouldSkip = true; oldMetadata.SkippedReason = SkippedRegistrationReason.Overridden; oldMetadata.SkippedReasonDescription = "The registration was overridden by another registration."; UpdateSkippedRegistrationComments(oldMetadata); }
private void UpdateSkippedRegistrationComments(TemplateRegistrationMetadata metadata) { const string indent = Indentations.MemberIndent; StringBuilder sb = new StringBuilder(metadata.MembersCommentBlock, metadata.MembersCommentBlock.Length + 500); sb.Append(indent); sb.Append("// Skip This Registration .............: "); sb.Append(metadata.ShouldSkip); sb.AppendLine(); sb.Append(indent); sb.Append("// Skipped Reason .....................: "); sb.Append(metadata.SkippedReason); sb.AppendLine(); sb.Append(indent); sb.Append("// Skipped Reason Description .........: "); sb.Append(metadata.SkippedReasonDescription); sb.AppendLine(); if (null != metadata.OverriddenBy) { sb.Append(indent); sb.Append("// Overridden By Registration Index ...: "); sb.Append(metadata.OverriddenBy.Index); sb.AppendLine(); } sb.Append(indent); sb.Append("// "); sb.Append(new string('-', 80)); sb.AppendLine(); sb.Append(indent); sb.Append("// NOTE: There is no code generated for this skipped registration."); sb.AppendLine(); sb.Append(indent); sb.Append("// "); sb.Append(new string('-', 80)); sb.AppendLine(); sb.AppendLine(); // Blank line to separate from next member metadata.MembersCommentBlock = sb.ToString(); }
private string GenerateGetInstanceCodeGeneratorMethodKey(TemplateRegistrationMetadata metadata) { return string.Format("GetInstance|{0}", metadata.Registration.Lifetime); }
private void ProcessRegistrations() { int registrationsCount = Registrations.Count; _metadataList = new List<TemplateRegistrationMetadata>(registrationsCount); _metadataMap = new Dictionary<string, TemplateRegistrationMetadata>(registrationsCount); int index = -1; foreach (IRegistration registration in Registrations) { index++; ValidateRegistration(registration, index); CheckRegistrationForAssembliesToBeReferenced(registration); MethodNameGenerator methodNameGenerator = new MethodNameGenerator(index, registration); string registrationKey = (registration.MappedType ?? registration.ConcreteType) + registration.Name; Type typeKey = registration.MappedType ?? registration.ConcreteType; TemplateRegistrationMetadata metadata = new TemplateRegistrationMetadata( methodNameGenerator, _namedHandlerMapEntries, _namedTypedHandlerMapEntries, _namedHandlerSubMapEntries, _namedTypedHandlerSubMapEntries) { Index = index, InstanceFieldName = "Instance" + index, RegistrationKey = registrationKey, Registration = registration, RegistrationType = RegistrationType.Explicit, TypeKey = typeKey }; _metadataList.Add(metadata); var codeGenerationResult = GenerateGetInstanceCodeForRegistration(metadata); if (codeGenerationResult != RegistrationCodeGenerationResult.Successful) { continue; } CheckForMetadataOverride(registrationKey, metadata); _metadataMap[registrationKey] = metadata; } }
private RegistrationCodeGenerationResult GenerateGetInstanceCodeForRegistration(TemplateRegistrationMetadata metadata) { metadata.CodeGeneratorMethodKey = GenerateGetInstanceCodeGeneratorMethodKey(metadata); Func<TemplateRegistrationMetadata, Type, IRegistrationCodeGenerator> func; if (false == _codeGeneratorMethodMap.TryGetValue(metadata.CodeGeneratorMethodKey, out func)) { metadata.ShouldSkip = true; metadata.SkippedReason = SkippedRegistrationReason.NoCodeGenerator; metadata.SkippedReasonDescription = string.Format( "The code generator delegate was not found for the CodeGeneratorMethodKey '{0}'." , metadata.CodeGeneratorMethodKey); UpdateSkippedRegistrationComments(metadata); return RegistrationCodeGenerationResult.Skipped; } IRegistrationCodeGenerator codeGenerator = func(metadata, metadata.TypeKey); codeGenerator.Generate(); return RegistrationCodeGenerationResult.Successful; }