< Summary

Class:DCL.ServiceLocator
Assembly:Environment
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Environment/ServiceLocator.cs
Covered lines:32
Uncovered lines:10
Coverable lines:42
Total lines:100
Line coverage:76.1% (32 of 42)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ServiceLocator()0%110100%
ServiceLocator()0%110100%
Register[T](...)0%220100%
Unregister[T]()0%6200%
Get[T]()0%3.13077.78%
Initialize()0%4.034087.5%
Dispose()0%220100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Environment/ServiceLocator.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using UnityEngine;
 4using UnityEngine.Assertions;
 5
 6namespace DCL
 7{
 8    public delegate IService ServiceBuilder();
 9
 10    public class ServiceLocator : IDisposable
 11    {
 112        private static bool VERBOSE = false;
 113        private static Logger logger = new Logger("ServiceLocator") { verboseEnabled = VERBOSE };
 14
 89615        private Dictionary<Type, IService> services = new Dictionary<Type, IService>();
 89616        private Dictionary<Type, ServiceBuilder> serviceBuilders = new Dictionary<Type, ServiceBuilder>();
 17
 18        public ServiceBuilder Register<T>(ServiceBuilder data) where T : IService
 19        {
 2197620            Type type = typeof(T);
 2197621            Assert.IsTrue( type.IsInterface, "ServiceLocator's generic type should be an interface." );
 22
 2197623            if (serviceBuilders.ContainsKey(type))
 24            {
 411725                serviceBuilders[type] = data;
 411726                return data;
 27            }
 28
 1785929            serviceBuilders.Add(type, data);
 1785930            return data;
 31        }
 32
 33        public void Unregister<T>() where T : IService
 34        {
 035            Type type = typeof(T);
 036            Assert.IsTrue( type.IsInterface, "ServiceLocator's generic type should be an interface." );
 37
 038            if (!serviceBuilders.ContainsKey(type))
 39            {
 040                logger.Warning($"Trying to unregister non-existent type! type: {type.FullName}");
 041                return;
 42            }
 43
 044            serviceBuilders.Remove(type);
 045        }
 46
 47        public T Get<T>() where T : class, IService
 48        {
 5031549            Type type = typeof(T);
 5031550            Assert.IsTrue( type.IsInterface, "ServiceLocator's generic type should be an interface." );
 51
 5031552            if (!serviceBuilders.ContainsKey(type))
 53            {
 25554                logger.Verbose($"Not registered! use Register<T> to set the type builder first and then Initialize() to 
 25555                return null;
 56            }
 57
 5006058            if (!services.ContainsKey(type))
 59            {
 060                logger.Warning($"Not initialized! use Initialize() to create this service. type: {type.FullName}");
 061                return null;
 62            }
 63
 5006064            return services[type] as T;
 65        }
 66
 67        public void Initialize()
 68        {
 179069            foreach ( var service in services )
 70            {
 071                service.Value.Dispose();
 72            }
 73
 89574            services.Clear();
 75
 3750876            foreach ( var kvp in serviceBuilders )
 77            {
 1785978                var builderType = kvp.Key;
 1785979                var builder = kvp.Value;
 1785980                services.Add( builderType, builder.Invoke() );
 81            }
 82
 3750883            foreach ( var service in services )
 84            {
 1785985                service.Value.Initialize();
 86            }
 89587        }
 88
 89        public void Dispose()
 90        {
 3929491            foreach ( var service in services )
 92            {
 1785993                service.Value.Dispose();
 94            }
 95
 178896            services.Clear();
 178897            serviceBuilders.Clear();
 178898        }
 99    }
 100}