< Summary

Class:DCL.ServiceLocator
Assembly:Environment
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Environment/ServiceLocator.cs
Covered lines:33
Uncovered lines:10
Coverable lines:43
Total lines:104
Line coverage:76.7% (33 of 43)
Covered branches:0
Total branches:0
Covered methods:6
Total methods:7
Method coverage:85.7% (6 of 7)

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%9.099089.47%
Dispose()0%220100%

File(s)

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

#LineLine coverage
 1using Cysharp.Threading.Tasks;
 2using System;
 3using System.Collections.Generic;
 4using System.Threading;
 5using UnityEngine;
 6using UnityEngine.Assertions;
 7
 8namespace DCL
 9{
 10    public delegate IService ServiceBuilder();
 11
 12    public class ServiceLocator : IDisposable
 13    {
 114        private static bool VERBOSE = false;
 115        private static Logger logger = new Logger("ServiceLocator") { verboseEnabled = VERBOSE };
 16
 76017        private Dictionary<Type, IService> services = new Dictionary<Type, IService>();
 76018        private Dictionary<Type, ServiceBuilder> serviceBuilders = new Dictionary<Type, ServiceBuilder>();
 19
 20        public ServiceBuilder Register<T>(ServiceBuilder data) where T : IService
 21        {
 3848022            Type type = typeof(T);
 3848023            Assert.IsTrue( type.IsInterface, "ServiceLocator's generic type should be an interface." );
 24
 3848025            if (serviceBuilders.ContainsKey(type))
 26            {
 316227                serviceBuilders[type] = data;
 316228                return data;
 29            }
 30
 3531831            serviceBuilders.Add(type, data);
 3531832            return data;
 33        }
 34
 35        public void Unregister<T>() where T : IService
 36        {
 037            Type type = typeof(T);
 038            Assert.IsTrue( type.IsInterface, "ServiceLocator's generic type should be an interface." );
 39
 040            if (!serviceBuilders.ContainsKey(type))
 41            {
 042                logger.Warning($"Trying to unregister non-existent type! type: {type.FullName}");
 043                return;
 44            }
 45
 046            serviceBuilders.Remove(type);
 047        }
 48
 49        public T Get<T>() where T : class
 50        {
 6141251            Type type = typeof(T);
 6141252            Assert.IsTrue( type.IsInterface, "ServiceLocator's generic type should be an interface." );
 53
 6141254            if (!serviceBuilders.ContainsKey(type))
 55            {
 147956                logger.Verbose($"Not registered! use Register<T> to set the type builder first and then Initialize() to 
 147957                return null;
 58            }
 59
 5993360            if (!services.ContainsKey(type))
 61            {
 062                logger.Warning($"Not initialized! use Initialize() to create this service. type: {type.FullName}");
 063                return null;
 64            }
 65
 5993366            return services[type] as T;
 67        }
 68
 69        public async UniTask Initialize(CancellationToken cancellationToken = default)
 70        {
 151871            foreach ( var service in services )
 72            {
 073                service.Value.Dispose();
 74            }
 75
 75976            services.Clear();
 77
 7215478            foreach ( var kvp in serviceBuilders )
 79            {
 3531880                var builderType = kvp.Key;
 3531881                var builder = kvp.Value;
 3531882                services.Add( builderType, builder.Invoke() );
 83            }
 84
 7215485            foreach ( var service in services )
 86            {
 3531887                service.Value.Initialize();
 88            }
 89
 3627890            await UniTask.WhenAll(services.Select(s => s.Value.InitializeAsync(cancellationToken))).SuppressCancellation
 73091        }
 92
 93        public void Dispose()
 94        {
 7335095            foreach ( var service in services )
 96            {
 3528397                service.Value.Dispose();
 98            }
 99
 1392100            services.Clear();
 1392101            serviceBuilders.Clear();
 1392102        }
 103    }
 104}