Files
dungeons/Assets/Plugins/Zenject/Source/Providers/TransientProvider.cs

92 lines
2.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using ModestTree;
using Zenject.Internal;
namespace Zenject
{
[NoReflectionBaking]
public class TransientProvider : IProvider
{
readonly DiContainer _container;
readonly Type _concreteType;
readonly List<TypeValuePair> _extraArguments;
readonly object _concreteIdentifier;
readonly Action<InjectContext, object> _instantiateCallback;
public TransientProvider(
Type concreteType, DiContainer container,
IEnumerable<TypeValuePair> extraArguments, string bindingContext,
object concreteIdentifier,
Action<InjectContext, object> instantiateCallback)
{
Assert.That(!concreteType.IsAbstract(),
"Expected non-abstract type for given binding but instead found type '{0}'{1}",
concreteType, bindingContext == null ? "" : " when binding '{0}'".Fmt(bindingContext));
_container = container;
_concreteType = concreteType;
_extraArguments = extraArguments.ToList();
_concreteIdentifier = concreteIdentifier;
_instantiateCallback = instantiateCallback;
}
public bool IsCached
{
get { return false; }
}
public bool TypeVariesBasedOnMemberType
{
get { return _concreteType.IsOpenGenericType(); }
}
public Type GetInstanceType(InjectContext context)
{
if (!_concreteType.DerivesFromOrEqual(context.MemberType))
{
return null;
}
return GetTypeToCreate(context.MemberType);
}
public void GetAllInstancesWithInjectSplit(
InjectContext context, List<TypeValuePair> args, out Action injectAction, List<object> buffer)
{
Assert.IsNotNull(context);
var instanceType = GetTypeToCreate(context.MemberType);
var extraArgs = ZenPools.SpawnList<TypeValuePair>();
extraArgs.AllocFreeAddRange(_extraArguments);
extraArgs.AllocFreeAddRange(args);
var instance = _container.InstantiateExplicit(instanceType, false, extraArgs, context, _concreteIdentifier);
injectAction = () =>
{
_container.InjectExplicit(
instance, instanceType, extraArgs, context, _concreteIdentifier);
Assert.That(extraArgs.Count == 0);
ZenPools.DespawnList(extraArgs);
if (_instantiateCallback != null)
{
_instantiateCallback(context, instance);
}
};
buffer.Add(instance);
}
Type GetTypeToCreate(Type contractType)
{
return ProviderUtil.GetTypeToInstantiate(contractType, _concreteType);
}
}
}