< Summary

Class:DCL.ServiceLocator
Assembly:Environment
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Environment/ServiceLocator.cs
Covered lines:35
Uncovered lines:7
Coverable lines:42
Total lines:100
Line coverage:83.3% (35 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%330100%
Initialize()0%440100%
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
 71515        private Dictionary<Type, IService> services = new Dictionary<Type, IService>();
 71516        private Dictionary<Type, ServiceBuilder> serviceBuilders = new Dictionary<Type, ServiceBuilder>();
 17
 18        public ServiceBuilder Register<T>(ServiceBuilder data) where T : IService
 19        {
 2722520            Type type = typeof(T);
 2722521            Assert.IsTrue( type.IsInterface, "ServiceLocator's generic type should be an interface." );
 22
 2722523            if (serviceBuilders.ContainsKey(type))
 24            {
 300325                serviceBuilders[type] = data;
 300326                return data;
 27            }
 28
 2422229            serviceBuilders.Add(type, data);
 2422230            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        {
 9899249            Type type = typeof(T);
 9899250            Assert.IsTrue( type.IsInterface, "ServiceLocator's generic type should be an interface." );
 51
 9899252            if (!serviceBuilders.ContainsKey(type))
 53            {
 27854                logger.Verbose($"Not registered! use Register<T> to set the type builder first and then Initialize() to 
 27855                return null;
 56            }
 57
 9871458            if (!services.ContainsKey(type))
 59            {
 49360                logger.Warning($"Not initialized! use Initialize() to create this service. type: {type.FullName}");
 49361                return null;
 62            }
 63
 9822164            return services[type] as T;
 65        }
 66
 67        public void Initialize()
 68        {
 150669            foreach ( var service in services )
 70            {
 3871                service.Value.Dispose();
 72            }
 73
 71574            services.Clear();
 75
 4995076            foreach ( var kvp in serviceBuilders )
 77            {
 2426078                var builderType = kvp.Key;
 2426079                var builder = kvp.Value;
 2426080                services.Add( builderType, builder.Invoke() );
 81            }
 82
 4995083            foreach ( var service in services )
 84            {
 2426085                service.Value.Initialize();
 86            }
 71587        }
 88
 89        public void Dispose()
 90        {
 5115291            foreach ( var service in services )
 92            {
 2422293                service.Value.Dispose();
 94            }
 95
 135496            services.Clear();
 135497            serviceBuilders.Clear();
 135498        }
 99    }
 100}