mirror of
https://github.com/Bragin-Stepan/project-entity.git
synced 2026-03-05 07:41:10 +00:00
80 lines
2.2 KiB
C#
80 lines
2.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Assets._Project.Develop.Runtime.Infrastructure.DI
|
|
{
|
|
public class DIContainer
|
|
{
|
|
private readonly Dictionary<Type, Registration> _container = new();
|
|
|
|
private readonly List<Type> _requests = new();
|
|
|
|
private readonly DIContainer _parent;
|
|
|
|
public DIContainer() { }
|
|
|
|
public DIContainer(DIContainer parent) => _parent = parent;
|
|
|
|
public IRegistrationOptions RegisterAsSingle<T>(Func<DIContainer, T> creator)
|
|
{
|
|
if (IsAlreadyRegister<T>())
|
|
throw new InvalidOperationException($"{typeof(T)} already register");
|
|
|
|
Registration registration = new Registration(container => creator.Invoke(container));
|
|
_container.Add(typeof(T), registration);
|
|
return registration;
|
|
}
|
|
|
|
public bool IsAlreadyRegister<T>()
|
|
{
|
|
if (_container.ContainsKey(typeof(T)))
|
|
return true;
|
|
|
|
if (_parent != null)
|
|
return _parent.IsAlreadyRegister<T>();
|
|
|
|
return false;
|
|
}
|
|
|
|
public T Resolve<T>()
|
|
{
|
|
if (_requests.Contains(typeof(T)))
|
|
throw new InvalidOperationException($"Cycle resolve for {typeof(T)}");
|
|
|
|
_requests.Add(typeof(T));
|
|
|
|
try
|
|
{
|
|
if (_container.TryGetValue(typeof(T), out Registration registration))
|
|
return (T)registration.CreateInstanceFrom(this);
|
|
|
|
if (_parent != null)
|
|
return _parent.Resolve<T>();
|
|
}
|
|
finally
|
|
{
|
|
_requests.Remove(typeof(T));
|
|
}
|
|
|
|
throw new InvalidOperationException($"Registration for {typeof(T)} not exists");
|
|
}
|
|
|
|
public void Initialize()
|
|
{
|
|
foreach (Registration registration in _container.Values)
|
|
{
|
|
if (registration.IsNonLazy)
|
|
registration.CreateInstanceFrom(this);
|
|
|
|
registration.OnInitialize();
|
|
}
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
foreach (Registration registration in _container.Values)
|
|
registration.OnDispose();
|
|
}
|
|
}
|
|
}
|