protected internal override void Add(ObjectBuilder builder)
        {
            _lock.Enter();
            try
            {
                if (_builders.Count == 0)
                {
                    _builders.Add(builder);
                    return;
                }

                var newRanking = builder.ObjectDescription.Ranking;
                if (newRanking < _builders[0].ObjectDescription.Ranking)
                {
                    _builders.Insert(0, builder);
                    return;
                }

                var targetPosition = 0;
                for (int i = _builders.Count - 1; i >= 0; i--)
                {
                    var existing = _builders[i];
                    if (newRanking >= existing.ObjectDescription.Ranking)
                    {
                        targetPosition = i + 1;
                        break;
                    }
                }
                _builders.Insert(targetPosition, builder);
            }
            finally
            {
                _lock.Exit();
            }
        }
        public override List <ObjectObserver> GetObserversForAdd(ObjectBuilder builder)
        {
            List <ObjectObserver> observers = null;

            _lock.Enter();
            try
            {
                foreach (var observer in Observers)
                {
                    if (!observer.CanAdd(builder))
                    {
                        continue;
                    }
                    if (observers == null)
                    {
                        observers = new List <ObjectObserver>();
                    }
                    observers.Add(observer);
                }
                return(observers);
            }
            finally
            {
                _lock.Exit();
            }
        }
 /// <summary>
 /// Adds the specified component to the container.
 /// </summary>
 /// <param name="component">The component.</param>
 public void Add(object component)
 {
     Requires.NotNull(component, "component");
     _lock.Enter();
     try
     {
         _type2Components.Add(component.GetType(), component);
     }
     finally
     {
         _lock.Exit();
     }
 }
Example #4
0
 // The builder.BuilderType looks like List<>/IList<> or some other types.
 public void Add(IObjectMapperBuilder builder)
 {
     Requires.NotNull(builder, "builder");
     _lock.Enter();
     try
     {
         _type2Builders.Add(builder.BuilderType, builder);
     }
     finally
     {
         _lock.Exit();
     }
 }
        public Type GetOrCreateParameterMergerType(int paramLength)
        {
            //if (paramLength > 8)
            //    throw new ArgumentOutOfRangeException("Can not build injectors for constructor with more than 8 parameters right now. This function is coming soon...");

            if (paramLength == 0)
            {
                throw new InvalidOperationException();
            }

            var result = GetDefaultParameterMergerType(paramLength);

            if (result != null)
            {
                return(result);
            }

            _mergerLock.Enter();
            try
            {
                if (_length2Merger.TryGetValue(paramLength, out result))
                {
                    return(result);
                }

                result = _provider.CreateParameterMergerType(paramLength);
                _length2Merger.Add(paramLength, result);
                return(result);
            }
            finally
            {
                _mergerLock.Exit();
            }
        }
Example #6
0
        protected int AddObjectBuilderCore(T builder)
        {
            MyLock.Enter();
            try
            {
                if (MyBuilders.Count == 0)
                {
                    MyBuilders.Add(builder);
                    return(0);
                }

                var newRanking = builder.ObjectDescription.Ranking;
                if (newRanking < MyBuilders[0].ObjectDescription.Ranking)
                {
                    MyBuilders.Insert(0, builder);
                    return(0);
                }

                var targetPosition = 0;
                for (int i = MyBuilders.Count - 1; i >= 0; i--)
                {
                    var existing = MyBuilders[i];
                    if (newRanking >= existing.ObjectDescription.Ranking)
                    {
                        targetPosition = i + 1;
                        break;
                    }
                }
                MyBuilders.Insert(targetPosition, builder);
                return(targetPosition);
            }
            finally
            {
                MyLock.Exit();
            }
        }
        public Type GetOrCreateInjectorType(InjectorEmitBody emitBody)
        {
            EmitInjectorKey key;
            var             methodEmitBodySet = emitBody.MethodEmitBodySet;

            if (methodEmitBodySet != null)
            {
                var injectedMethods = new MethodInfo[methodEmitBodySet.Length];
                for (int i = 0; i < methodEmitBodySet.Length; i++)
                {
                    var methodEmitBody = methodEmitBodySet[i];
                    injectedMethods[i] = methodEmitBody.InjectedMethod;
                }
                key = new EmitConstructorAndMemberInjectorKey(emitBody.ConstructorEmitBody.InjectedConstructor, injectedMethods);
            }
            else
            {
                key = new EmitInjectorKey(emitBody.ConstructorEmitBody.InjectedConstructor);
            }

            _injectorLock.Enter();
            try
            {
                Type injectorType;
                if (_key2Injector.TryGetValue(key, out injectorType))
                {
                    return(injectorType);
                }

                injectorType = _provider.CreateInjectorType(emitBody, GetUniqueDynamicTypeName());
                _key2Injector.Add(key, injectorType);
                return(injectorType);
            }
            finally
            {
                _injectorLock.Exit();
            }
        }
 protected override void ExitWithoutChaining(ILock theLock)
 {
     theLock.Exit();
 }
Example #9
0
 /// <summary>
 /// Releases unmanaged and - optionally - managed resources.
 /// </summary>
 public void Dispose()
 {
     _lock.Exit();
 }
Example #10
0
 protected override void ExitWithoutChaining(ILock theLock)
 {
     theLock.Exit();
 }