Esempio n. 1
0
 protected override object GetInstance(
     IResolvingContext context,
     Type concreteType,
     IContainer fromContainer)
 {
     return(_activator.Activate(concreteType, fromContainer, context));
 }
Esempio n. 2
0
 protected override IContainer GetOwnerContainer(
     IResolvingContext context,
     Type concreteType
     )
 {
     return(context.CurrentContainer);
 }
 public object GetOrCreateInstance(
     Type concreteType,
     IActivator activator,
     IResolvingContext context,
     string registrationName)
 {
     if (!Monitor.TryEnter(_syncRoot, TimeSpan.FromSeconds(5)))
     {
         throw new InvalidOperationException("Potentially deadlock");
     }
     try
     {
         if (HasInstance(concreteType, registrationName))
         {
             return(GetInstance(concreteType, registrationName));
         }
         else
         {
             var instance = activator.Activate(concreteType, _parent, context);;
             PutInstance(concreteType, instance, registrationName);
             return(instance);
         }
     }
     finally
     {
         Monitor.Exit(_syncRoot);
     }
 }
Esempio n. 4
0
        object ResolveImpl(IResolvingContext context)
        {
            // Grab the container
            var container = GetOwnerContainer(context, _concreteType);
            var instance  = GetInstance(context, _concreteType, container);

            // return it
            return(instance);
        }
Esempio n. 5
0
        public object Activate(Type concreteType, IContainer container, IResolvingContext context)
        {
            var t = _lambda(container);

            if (t is IDisposable)
            {
                container.AddDisposable((IDisposable)t);
            }
            return(t);
        }
Esempio n. 6
0
 protected override object GetInstance(
     IResolvingContext context,
     Type concreteType,
     IContainer container)
 {
     return(container.Instances.GetOrCreateInstance(
                concreteType,
                _activator,
                context,
                _registrationName));
 }
Esempio n. 7
0
        protected override IContainer GetOwnerContainer(
            IResolvingContext context,
            Type concreteType
            )
        {
            // Notes
            // Singleton are stored in the root container
            var container = context.KickOffContainer;

            while (container.Parent != null)
            {
                container = (IContainer)container.Parent;
            }
            return(container);
        }
Esempio n. 8
0
        object IResolver.Resolve(IResolvingContext context)
        {
            // Validate
            if (context.ResolvingStack.Contains(_concreteType))
            {
                throw new CircularDependencyException(_concreteType);
            }

            // To avoid having circular dependency,
            // we keep track the stack
            context.ResolvingStack.Add(_concreteType);
            try
            {
                return(ResolveImpl(context));
            }
            finally { context.ResolvingStack.Remove(_concreteType); }
        }
Esempio n. 9
0
        public object Activate(
            Type concreteType,
            IContainer container,
            IResolvingContext context)
        {
            // Freshly construct the instance
            var constructor        = concreteType.GetConstructors().First();
            var resolvedParameters = constructor
                                     .GetParameters()
                                     .Select(parameterInfo => ProvideParameterValue(container, context, parameterInfo))
                                     .ToArray();
            var inst = constructor.Invoke(resolvedParameters);

            if (inst is IDisposable)
            {
                container.AddDisposable((IDisposable)inst);
            }
            return(inst);
        }
        protected override IContainer GetOwnerContainer(
            IResolvingContext context,
            Type concreteType)
        {
            var container = context.CurrentContainer;

            while (container.Parent != null)
            {
                if (container.Name == _containerName)
                {
                    return(container);
                }
                else
                {
                    container = (IContainer)container.Parent;
                }
            }

            throw new DependencyException("Failed to find container named: " + _containerName);
        }
Esempio n. 11
0
        object ProvideParameterValue(
            IContainer container,
            IResolvingContext context,
            ParameterInfo parameterInfo)
        {
            // Search to find the first value provider that match this parameter
            for (var i = 0; i < _parameterResolvers.Count; i++)
            {
                if (_parameterResolvers[i].Match(parameterInfo))
                {
                    var inst = _parameterResolvers[i].ValueProvider(parameterInfo, container);
                    if (inst is IDisposable)
                    {
                        container.AddDisposable((IDisposable)container);
                    }
                    return(inst);
                }
            }

            // Use the container to resolve the parameter by default
            return(container.Resolve(parameterInfo.ParameterType, context));
        }
Esempio n. 12
0
        public object Resolve(Type type, IResolvingContext context, string registrationName = null)
        {
            ThrowIfDisposed();

            var registration = FindRegistration(type, registrationName);

            context = null == context
                                ? new ResolvingContext {
                KickOffContainer = this
            }
                                : context;
            context.CurrentContainer = this;
            if (null == registration)
            {
                throw new DependencyException(
                          "Unregistered type: " + type.ToString() + "; registrationName=" + registrationName,
                          context.ResolvingStack);
            }
            else
            {
                return(registration.Resolver.Resolve(context));
            }
        }
Esempio n. 13
0
 protected abstract object GetInstance(
     IResolvingContext context,
     Type concreteType,
     IContainer fromContainer
     );
Esempio n. 14
0
 protected abstract IContainer GetOwnerContainer(
     IResolvingContext context,
     Type concreteType
     );