/// <summary> /// Adds the builder as the default builder for the given entity type /// </summary> /// <typeparam name="TBuilder">The type of the builder.</typeparam> /// <param name="logicalName">Name of the logical.</param> /// <exception cref="System.Exception"> /// </exception> private void SetBuilderType <TBuilder>(string logicalName) where TBuilder : IEntityBuilder { var constructor = GetIdConstructor <TBuilder>(); if (DefaultBuilderConstructors.TryGetValue(logicalName, out ConstructorInfo existingConstructor)) { // Should only have one type. Check to make sure type is the same if (existingConstructor.DeclaringType != constructor.DeclaringType) { // ReSharper disable PossibleNullReferenceException throw new Exception($"Only one type of Builder can be used per entity. Attempt was made to define builder {constructor.DeclaringType.FullName}, when builder {existingConstructor.DeclaringType.FullName} already is defined!"); // ReSharper restore PossibleNullReferenceException } } else { DefaultBuilderConstructors.Add(logicalName, constructor); } }
/// <summary> /// Gets the builder for the given Id /// </summary> /// <param name="id">The identifier.</param> /// <returns></returns> public IEntityBuilder Get(Id id) { if (id != Guid.Empty && !Ids.ContainsKey(id)) { Ids.Add(id, id); } if (Builders.TryGetValue(id, out BuilderInfo builder)) { return(builder.Builder); } if (!DefaultBuilderConstructors.TryGetValue(id, out ConstructorInfo constructor)) { constructor = GetGenericConstructor(id); } builder = CreateBuilder(id, constructor); return(builder.Builder); }
/// <summary> /// Creates a GenericEntityBuilder of the type of logical name being passed in. Employs locking since BuilderForEntity is static /// </summary> /// <param name="logicalName">Name of the Entity to create a GenericEntityBuilder Constructor For.</param> /// <returns></returns> private ConstructorInfo GetGenericConstructor(string logicalName) { if (DefaultBuilderConstructors.TryGetValue(logicalName, out ConstructorInfo constructor)) { return(constructor); } lock (BuilderConstructorForEntityLock) { if (DefaultBuilderConstructors.TryGetValue(logicalName, out constructor)) { return(constructor); } var builder = typeof(GenericEntityBuilder <>).MakeGenericType(TestBase.GetType(logicalName)); constructor = builder.GetConstructor(new[] { typeof(Id) }); DefaultBuilderConstructors.Add(logicalName, constructor); return(constructor); } }
/// <summary> /// Creates a GenericEntityBuilder of the type of logical name being passed in. Employs locking since BuilderForEntity is static /// </summary> /// <param name="logicalName">Name of the Entity to create a GenericEntityBuilder Constructor For.</param> /// <returns></returns> private ConstructorInfo GetGenericConstructor(string logicalName) { if (DefaultBuilderConstructors.TryGetValue(logicalName, out ConstructorInfo constructor)) { return(constructor); } lock (BuilderConstructorForEntityLock) { if (DefaultBuilderConstructors.TryGetValue(logicalName, out constructor)) { return(constructor); } var builderType = logicalName == ConnectionRoleAssociation.EntityLogicalName ? typeof(N2NBuilder <>) : typeof(GenericEntityBuilder <>); var builder = builderType.MakeGenericType(TestBase.GetType(logicalName)); constructor = builder.GetConstructor(new[] { typeof(Id) }); DefaultBuilderConstructors.Add(logicalName, constructor); return(constructor); } }