Files
dungeons/Assets/Plugins/Zenject/Source/Binding/Finalizers/SubContainerBindingFinalizer.cs

107 lines
3.5 KiB
C#

using System;
using System.Collections.Generic;
using ModestTree;
namespace Zenject
{
[NoReflectionBaking]
public class SubContainerBindingFinalizer : ProviderBindingFinalizer
{
readonly object _subIdentifier;
readonly bool _resolveAll;
readonly Func<DiContainer, ISubContainerCreator> _creatorFactory;
public SubContainerBindingFinalizer(
BindInfo bindInfo, object subIdentifier,
bool resolveAll, Func<DiContainer, ISubContainerCreator> creatorFactory)
: base(bindInfo)
{
_subIdentifier = subIdentifier;
_resolveAll = resolveAll;
_creatorFactory = creatorFactory;
}
protected override void OnFinalizeBinding(DiContainer container)
{
if (BindInfo.ToChoice == ToChoices.Self)
{
Assert.IsEmpty(BindInfo.ToTypes);
FinalizeBindingSelf(container);
}
else
{
FinalizeBindingConcrete(container, BindInfo.ToTypes);
}
}
void FinalizeBindingConcrete(DiContainer container, List<Type> concreteTypes)
{
var scope = GetScope();
switch (scope)
{
case ScopeTypes.Transient:
{
RegisterProvidersForAllContractsPerConcreteType(
container,
concreteTypes,
(_, concreteType) =>
new SubContainerDependencyProvider(
concreteType, _subIdentifier, _creatorFactory(container), _resolveAll));
break;
}
case ScopeTypes.Singleton:
{
var containerCreator = new SubContainerCreatorCached(_creatorFactory(container));
RegisterProvidersForAllContractsPerConcreteType(
container,
concreteTypes,
(_, concreteType) =>
new SubContainerDependencyProvider(
concreteType, _subIdentifier, containerCreator, _resolveAll));
break;
}
default:
{
throw Assert.CreateException();
}
}
}
void FinalizeBindingSelf(DiContainer container)
{
var scope = GetScope();
switch (scope)
{
case ScopeTypes.Transient:
{
RegisterProviderPerContract(
container,
(_, contractType) => new SubContainerDependencyProvider(
contractType, _subIdentifier, _creatorFactory(container), _resolveAll));
break;
}
case ScopeTypes.Singleton:
{
var containerCreator = new SubContainerCreatorCached(_creatorFactory(container));
RegisterProviderPerContract(
container,
(_, contractType) =>
new SubContainerDependencyProvider(
contractType, _subIdentifier, containerCreator, _resolveAll));
break;
}
default:
{
throw Assert.CreateException();
}
}
}
}
}