< 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
 90715        private Dictionary<Type, IService> services = new Dictionary<Type, IService>();
 90716        private Dictionary<Type, ServiceBuilder> serviceBuilders = new Dictionary<Type, ServiceBuilder>();
 17
 18        public ServiceBuilder Register<T>(ServiceBuilder data) where T : IService
 19        {
 2164620            Type type = typeof(T);
 2164621            Assert.IsTrue( type.IsInterface, "ServiceLocator's generic type should be an interface." );
 22
 2164623            if (serviceBuilders.ContainsKey(type))
 24            {
 357025                serviceBuilders[type] = data;
 357026                return data;
 27            }
 28
 1807629            serviceBuilders.Add(type, data);
 1807630            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        {
 5081449            Type type = typeof(T);
 5081450            Assert.IsTrue( type.IsInterface, "ServiceLocator's generic type should be an interface." );
 51
 5081452            if (!serviceBuilders.ContainsKey(type))
 53            {
 26654                logger.Verbose($"Not registered! use Register<T> to set the type builder first and then Initialize() to 
 26655                return null;
 56            }
 57
 5054858            if (!services.ContainsKey(type))
 59            {
 060                logger.Warning($"Not initialized! use Initialize() to create this service. type: {type.FullName}");
 061                return null;
 62            }
 63
 5054864            return services[type] as T;
 65        }
 66
 67        public void Initialize()
 68        {
 181269            foreach ( var service in services )
 70            {
 071                service.Value.Dispose();
 72            }
 73
 90674            services.Clear();
 75
 3796476            foreach ( var kvp in serviceBuilders )
 77            {
 1807678                var builderType = kvp.Key;
 1807679                var builder = kvp.Value;
 1807680                services.Add( builderType, builder.Invoke() );
 81            }
 82
 3796483            foreach ( var service in services )
 84            {
 1807685                service.Value.Initialize();
 86            }
 90687        }
 88
 89        public void Dispose()
 90        {
 3976091            foreach ( var service in services )
 92            {
 1807693                service.Value.Dispose();
 94            }
 95
 180496            services.Clear();
 180497            serviceBuilders.Clear();
 180498        }
 99    }
 100}