public void Init()
 {
     _imageFromCacheService  = Substitute.For <IImageFromCacheService>();
     _imageFromWebCamService = Substitute.For <IImageFromWebCamService>();
     _dateTimeProvider       = Substitute.For <IDateTimeProvider>();
     _logger       = null;
     _cacheUpdater = new CacheUpdaterInfo();
     _cacheUpdaterExpirationMilliSec = 600;
 }
        public ImageProviderService(IImageFromCacheService imageFromCacheService,
                                    IImageFromWebCamService imageFromWebCamService,
                                    IDateTimeProvider dateTimeProvider,
                                    IMiniLogger logger,
                                    int cacheUpdaterExpirationMilliSec,
                                    CacheUpdaterInfo cacheUpdaterInfo,
                                    string imageErrorLogoUrl)
        {
            if (cacheUpdaterExpirationMilliSec < MinValueCacheUpdaterLifeTimeMilliSec)
            {
                throw new ArgumentException(
                          nameof(cacheUpdaterExpirationMilliSec) + $" = {cacheUpdaterExpirationMilliSec} < {MinValueCacheUpdaterLifeTimeMilliSec}");
            }

            _imageFromCacheService  = imageFromCacheService ?? throw new ArgumentNullException(nameof(imageFromCacheService));
            _imageFromWebCamService = imageFromWebCamService ?? throw new ArgumentNullException(nameof(imageFromWebCamService));
            _dateTimeProvider       = dateTimeProvider ?? throw new ArgumentNullException(nameof(dateTimeProvider));
            _logger = logger;
            _cacheUpdaterExpirationMilliSec = cacheUpdaterExpirationMilliSec;
            _cacheUpdaterInfo  = cacheUpdaterInfo ?? new CacheUpdaterInfo();
            _imageErrorLogoUrl = imageErrorLogoUrl;
        }
        /// <summary>
        /// Registers the type mappings with the Unity container (IoC container).
        /// </summary>
        /// <param name="container">The unity container to configure.</param>
        /// <remarks>
        /// There is no need to register concrete types such as controllers or
        /// API controllers (unless you want to change the defaults), as Unity
        /// allows resolving a concrete type even if it was not previously
        /// registered.
        /// </remarks>
        public static void RegisterTypes(IUnityContainer container)
        {
            // NOTE: To load from web.config uncomment the line below.
            // Make sure to add a Unity.Configuration to the using statements.
            // container.LoadConfiguration();

            // TODO: Register your type's mappings here.
            // container.RegisterType<IProductRepository, ProductRepository>();

            // Register interfaces
            AppConfiguration configuration = AppConfiguration.Instance;

            container.RegisterInstance(
                configuration,
                new ContainerControlledLifetimeManager()                 //Singleton
                );

            container.RegisterType <IDateTimeProvider, DateTimeProvider>(
                new ContainerControlledLifetimeManager()                 //Singleton
                );

            container.RegisterType <IMiniLogger, MiniLogger>(
                new InjectionConstructor(
                    container.Resolve <IDateTimeProvider>(),
                    container.Resolve <AppConfiguration>().UserIPsLogPath,
                    container.Resolve <AppConfiguration>().UserPtzCmdLogPath,
                    container.Resolve <AppConfiguration>().ErrorsLogPath,
                    container.Resolve <AppConfiguration>().CacheStatsLogPath
                    ));

            var imageCache = new CacheUpdateService();

            container.RegisterInstance(imageCache);

            container.RegisterType <IImageFromCacheService, ImageFromCacheService>(
                new InjectionConstructor(
                    container.Resolve <CacheUpdateService>(),
                    container.Resolve <IMiniLogger>(),
                    container.Resolve <AppConfiguration>().CacheLifeTimeMilliSec,
                    container.Resolve <AppConfiguration>().CameraFps
                    ));

            container.RegisterType <IImageFromWebCamService, ImageFromWebCamService>(
                new InjectionConstructor(
                    container.Resolve <AppConfiguration>().CameraConnectionInfo
                    ));

            var cacheUpdater = new CacheUpdaterInfo();

            container.RegisterInstance(
                cacheUpdater,
                new ContainerControlledLifetimeManager()                 //Singleton
                );

            container.RegisterType <IImageProviderService, ImageProviderService>(
                new InjectionConstructor(
                    container.Resolve <IImageFromCacheService>(),
                    container.Resolve <IImageFromWebCamService>(),
                    container.Resolve <IDateTimeProvider>(),
                    container.Resolve <IMiniLogger>(),
                    container.Resolve <AppConfiguration>().CacheUpdaterExpirationMilliSec,
                    container.Resolve <CacheUpdaterInfo>(),
                    container.Resolve <AppConfiguration>().ErrorImageLogPath
                    ));


            //// Register controllers - not needed
            //container.RegisterType<BaseApiController>();
            //container.RegisterType<ImageController>();
            //container.RegisterType<PtzController>();

            GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
        }