/// <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);
        }
Ejemplo n.º 3
0
        /// <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);
            }
        }