public async Task <IAuthorization> LoadAuthorization()
        {
            if (_cache != null)
            {
                if (await _cache.Exists(KnownCacheKeys.AuthenticationToken))
                {
                    var auth = await _cache.Get <IAuthorization>(KnownCacheKeys.AuthenticationToken);

                    if (!string.IsNullOrEmpty(auth?.Item?.AccessToken))
                    {
                        if (auth.Item.HasExpired)
                        {
                            await _cache.Delete(KnownCacheKeys.AuthenticationToken);

                            return(null);
                        }

                        _container.RegisterInstance <IAuthorization>(auth.Item, "Session");
                        var client = _container.Resolve <IClient>();
                        client.Authorization = auth.Item;
                        _container.RegisterInstance <IClient>(client, "Session");

                        auth.Item.Refreshed = false;

                        _log.Debug("Authorization was loaded");
                        return(auth.Item);
                    }
                }
            }
            return(null);
        }
示例#2
0
        public void Register(IDIContainer container)
        {
            container.RegisterInstance(container, typeof(IDIContainer));
            container.RegisterInstance(container, typeof(IRegister));
            container.RegisterInstance(container, typeof(IResolve));

            container.Register <ISerializerFactory, SerializerFactory>();

            container.Register <ISerialize, JsonSerializer>();
            container.Register <ISerializer, JsonSerializer>();
            container.Register <IDeserialize, JsonSerializer>();

            JsonConvert.DefaultSettings = () =>
            {
                var settings = new JsonSerializerSettings();
                settings.ContractResolver = new ContractResolver(container);
                // do something with settings
                return(settings);
            };

            container.Register <ISerialize, JsonSerializer>(KnownSerializerFormats.JSON.ToString());
            container.Register <ISerializer, JsonSerializer>(KnownSerializerFormats.JSON.ToString());
            container.Register <IDeserialize, JsonSerializer>(KnownSerializerFormats.JSON.ToString());

            container.Register <ISerialize, JsonSerializer>(KnownSerializerIntents.Logging.ToString());
            container.Register <ISerializer, JsonSerializer>(KnownSerializerIntents.Logging.ToString());
            container.Register <IDeserialize, JsonSerializer>(KnownSerializerIntents.Logging.ToString());

            container.Register <IEncryptionFactory, BasicEncryptionFactory>();
            container.Register <IEncryption, BasicEncryption>();
            container.Register <IEncrypter, BasicEncryption>();
            container.RegisterInstance(EncryptionAlgorithm.Rijndael, typeof(EncryptionAlgorithm));
            container.Register <IDecrypter, BasicEncryption>();
            container.Register <IEncryptionKeyReadProvider, ConfigurationBasedEncryptionKeyProvider>();
            container.Register <IEncryptionKey, EncryptionKey>();
            container.Register <IValidateEncryptionKeys, ValidateEncryptionKeys>();

            container.RegisterSingleton <IVersionProvider, AssemblyInfoVersionProvider>();
            container.Register <IContractResolver, ContractResolver>();

            container.Register <ICompressionFactory, CompressionFactory>();
            container.Register <ICompression, Compression>();

            container.Register <ICharacterEncodingConverter, CharacterEncodingConverter>();

            container.Register(typeof(IProgress <>), typeof(Progress <>));

            container.Register(typeof(ITimedBufferBatch <>), typeof(TimedBufferBatch <>));
            container.Register(typeof(ITimedBufferBatchWithErrorRetries <>), typeof(TimedBufferBatchWithErrorRetries <>));

            container.Register <IFeatureFlagProvider, ConfigurationBasedFeatureFlagProvider>();

            container.Register <IDomainDataLoader, DomainDataLoader>();
            container.Register <IUser, User>();

            RegisterActorMessageTypes(container);
        }
示例#3
0
        protected override void Initialize(IDIContainer container)
        {
            base.Initialize(container);

            var cm = container.GetInstance<IConfigurationManager<IStepMapConfig>>();
            cm.LoadConfiguation();
            container.RegisterInstance(cm.Config);
        }
示例#4
0
 public void Register(IDIContainer container)
 {
     if (!container.IsRegistered <IConfiguration>())
     {
         container.Register <IConfiguration, Configuration>();
         var config = container.Resolve <IConfiguration>();
         config.Build();
         container.RegisterInstance(config, typeof(IConfiguration));
     }
 }
示例#5
0
        public ICache <TKey, TValue> CreateCache <TKey, TValue>(string name)
        {
            KnownCaches cacheName;

            if (Enum.TryParse(name, true, out cacheName))
            {
                return(CreateCache <TKey, TValue>(cacheName));
            }

            var cache = GetCache <TKey, TValue>(name);

            if (cache == null)
            {
                cache = _container.Resolve <ICache <TKey, TValue> >("DEFAULT");
                _container.RegisterInstance(cache, typeof(ICache <TKey, TValue>), name);
            }

            return(cache);
        }
        public Task ExecutePostRegistrationStep(IDIContainer container, CancellationToken cancellationToken = default(CancellationToken))
        {
            var config          = container.Resolve <IConfiguration>();
            var actorSystemName = config.GetValueOrDefault("Actor:System:Name", "NeonTetra");
            var actorCore       = new ActorSystemCore(container, actorSystemName);
            var resolver        = new NeonTetraDIBridge(container, actorCore);

            actorCore.RootActorSystem.AddDependencyResolver(resolver);

            container.RegisterInstance(resolver, typeof(IDependencyResolver));
            container.RegisterInstance(actorCore);
            container.RegisterInstance(actorCore.RootActorSystem);

            var _userManagerActorRef = actorCore.RootActorSystem.ActorOf(actorCore.RootActorSystem.DI().Props(typeof(IUserManagerActor)), "UserManagerActor");

            container.RegisterInstance(_userManagerActorRef, "UserManagerActor");

            return(Task.CompletedTask);
        }
示例#7
0
        private void RegisterUIComponents()
        {
            DiContainer = DIContainer.Current;
            var uiRegistration = new UIRegistrationContainer();

            uiRegistration.Register(DiContainer);
            var sharedRegistration = new SharedRegistrationContainer();

            sharedRegistration.Register(DiContainer);

            DiContainer.RegisterInstance(Window.Current.CoreWindow.Dispatcher);

            _log = DiContainer.Resolve <ILog>();
        }
        public async Task ExecutePostRegistrationStep(IDIContainer container, CancellationToken cancellationToken = default(CancellationToken))
        {
            var config  = container.Resolve <IConfiguration>();
            var enabled = config.GetValueOrDefault("MQTT:Server:Enabled", true);

            if (enabled)
            {
                var port   = config.GetValueOrDefault("MQTT:Server:Port", 1889);
                var broker = new MqttBroker();
                await broker.StartAsync(container.Resolve <IAccountManager>(), port);

                container.RegisterInstance(broker);
            }
        }
示例#9
0
        private void Setup(IDIContainer container)
        {
            var factory     = DIContainer.Current.Resolve <IEnvironmentFactory>();
            var environment = factory.GetEnvironment(Environments.Production);

            DIContainer.Current.RegisterInstance(environment);

            container.RegisterInstance(new HardCodedConfiguration
            {
                ClientId     = "f1b18a19-f810-4f16-8a39-d6135f5ec052",
                ClientSecret = "aead4980-c966-4a26-abee-6bdb1ea23e5c",
                RedirectUri  = "https://accounts.moj.io",
                Environment  = DIContainer.Current.Resolve <IEnvironment>()
            } as IConfiguration);

            DIContainer.Current.Register <ILog, DebugLogger>("Debug");
        }
示例#10
0
        public void Register(IDIContainer container)
        {
            container.Register <IAttachment, Attachment>();
            container.Register <IBotClient, BotClient>();
            container.Register <IChannelAccount, ChannelAccount>();
            container.Register <ILocation, Location>();
            container.Register <IMention, Mention>();
            container.Register <IMessage, Message>();
            container.Register <IMojioConversationData, MojioConversationData>();
            container.Register <IEntity, Entity>();
            container.Register <IIntent, Intent>();

            var botAccount = container.Resolve <IChannelAccount>();

            botAccount.Id      = "kitt-mojio-1";
            botAccount.Address = "1080 Howe Street, Vancouver, BC Canada";
            botAccount.IsBot   = true;
            botAccount.Name    = "Kitt";
            container.RegisterInstance(botAccount, "bot");
        }
        public Task ExecutePostRegistrationStep(IDIContainer container,
                                                CancellationToken cancellationToken = default(CancellationToken))
        {
            Dictionary <string, string> loggingContext;

            if (container.IsRegistered <Dictionary <string, string> >("LoggingContext"))
            {
                loggingContext = container.Resolve <Dictionary <string, string> >("LoggingContext");
            }
            else
            {
                loggingContext = new Dictionary <string, string>();
                container.RegisterInstance(loggingContext, "LoggingContext");
            }

            loggingContext["Command Line"]      = Environment.CommandLine;
            loggingContext["Current Directory"] = Environment.CurrentDirectory;
            loggingContext["User Domain Name"]  = Environment.UserDomainName;
            loggingContext["User Name"]         = Environment.UserName;
            loggingContext["OS Version"]        = Environment.OSVersion.ToString();
            loggingContext["Machine Name"]      = Environment.MachineName;

            var host = Environment.GetEnvironmentVariable("Host");

            loggingContext["Host"] = host;

            if (container.IsRegistered <IConfiguration>())
            {
                var config = container.Resolve <IConfiguration>();
                loggingContext["Host Environment"]   = config.HostEnvironment;
                loggingContext["Entry Point"]        = config.EntryPoint;
                loggingContext["Environment"]        = config.Environment;
                loggingContext["Version"]            = config.Version;
                loggingContext["App Data Directory"] = config.AppDataDirectory.ToString();
                loggingContext["Debug Mode"]         = config.DebugMode.ToString().ToLowerInvariant();
                loggingContext["Root Directory"]     = config.RootDirectory.ToString();
            }

            return(Task.CompletedTask);
        }
        public Task ExecutePostRegistrationStep(IDIContainer container,
                                                CancellationToken cancellationToken = default(CancellationToken))
        {
            var configuration = container.Resolve <IConfiguration>();

            var knownCaches = configuration.GetValues <IKnownCacheSetup>("Cache:KnownCaches");

            if (knownCaches != null)
            {
                IDictionary <KnownCaches, IKnownCacheSetup> configValues =
                    new Dictionary <KnownCaches, IKnownCacheSetup>();

                foreach (var k in knownCaches)
                {
                    configValues.Add(k.CacheName, k);
                }
                var knownConfig = container.Resolve <IKnownCacheConfiguration>();
                knownConfig.CacheSetups = configValues.ToImmutableDictionary();
                container.RegisterInstance(knownConfig, typeof(IKnownCacheConfiguration));
            }

            return(Task.CompletedTask);
        }
        public async Task <IPlatformResponse <T> > Request <T>(ApiEndpoint endpoint, string relativePath, CancellationToken cancellationToken, IProgress <ISDKProgress> progress = null, HttpMethod method = null, string body = null, byte[] rawData = null, string contentType = "application/json", IDictionary <string, string> headers = null)
        {
            var monitor = _container.Resolve <IProgressMonitor>();

            if (progress != null)
            {
                monitor.Progress = progress;
                monitor.Start();
            }
            monitor.Report("Initializing Http Request", 0);

            var _method = HttpMethod.Get;

            if (method != null)
            {
                _method = method;
            }

            var platformResponse = new PlatformResponse <T>
            {
                Success = false
            };

            if (headers != null && headers.Count > 0)
            {
                if (headers.ContainsKey("Authorization"))
                {
                    var h = headers["Authorization"];
                    if (h.IndexOf(" ", StringComparison.Ordinal) > 0)
                    {
                        var type  = h.Substring(0, h.IndexOf(" ", StringComparison.Ordinal)).Trim();
                        var token = h.Substring(h.IndexOf(" ", StringComparison.Ordinal)).Trim();
                        AuthorizationType           = type;
                        Authorization.MojioApiToken = token;
                        headers.Remove("Authorization");
                    }
                }
            }

            HttpClient client;

            switch (endpoint)
            {
            case ApiEndpoint.Accounts:
                client = AccountsClient(contentType);
                break;

            case ApiEndpoint.Images:
                client = ImagesClient(contentType);
                break;

            case ApiEndpoint.Push:
                client = PushClient(contentType);
                break;

            default:
                client = ApiClient(contentType);
                break;
            }

            var request = new HttpRequestMessage(_method, relativePath);

            monitor.Report("Setting HttpContent Body", 0.1);

            if (!string.IsNullOrEmpty(body))
            {
                Debug.WriteLine($"Request Content:{body}");
                request.Content = new StringContent(body, Encoding.UTF8, contentType);
            }

            monitor.Report("Set HttpContent Body", 0.2);

            if (rawData != null)
            {
                monitor.Report("Creating MultiPart Form Content", 0.2);

                var requestContent = new MultipartFormDataContent(); //"Upload----" + DateTime.Now.ToString(CultureInfo.InvariantCulture));

                var imageContent = new ByteArrayContent(rawData);
                var fileName     = "image.png";
                var type         = "image/png";

                if (headers != null && headers.Count > 0)
                {
                    type     = (from x in headers where x.Key == "Content-Type" select x.Value).FirstOrDefault();
                    fileName = (from x in headers where x.Key == "Filename" select x.Value).FirstOrDefault();
                    if (!string.IsNullOrEmpty(type))
                    {
                        headers.Remove("Content-Type");
                    }
                    if (!string.IsNullOrEmpty(fileName))
                    {
                        headers.Remove("Filename");
                    }
                }

                imageContent.Headers.ContentDisposition          = ContentDispositionHeaderValue.Parse("form-data");
                imageContent.Headers.ContentDisposition.Name     = "\"file\"";
                imageContent.Headers.ContentDisposition.FileName = fileName;
                imageContent.Headers.ContentDisposition.Size     = rawData.Length;
                imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse(type);

                requestContent.Add(imageContent);
                request.Content = requestContent;

                monitor.Report("Created MultiPart Form Content", 0.3);
            }
            monitor.Report("Adding Headers", 0.4);

            if (headers != null && headers.Count > 0)
            {
                foreach (var h in headers)
                {
                    request.Headers.Add(h.Key, h.Value);
                }
            }
            request.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
            request.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));

            if (DisableSessionAffinity)
            {
                request.Headers.Add("Arr-Disable-Session-Affinity", "True");
            }

            monitor.Report("Added Headers", 0.4);

            if (cancellationToken.IsCancellationRequested)
            {
                platformResponse.WasCancelled = true;
                monitor.Report("Operation Cancelled", 0.5);
                return(platformResponse);
            }
            monitor.Report("Sending Http Request", 0.6);
            var requestSw = new Stopwatch();

            requestSw.Start();
            Debug.WriteLine($"Pre-flight request URL: {request.RequestUri}");

            using (var sendResult = await client.SendAsync(request, cancellationToken))
            {
                platformResponse.RequestDurationMS = requestSw.ElapsedMilliseconds;
                monitor.Report("Received Response from Http Request", 0.7);
                requestSw.Stop();

                platformResponse.Url = sendResult.RequestMessage.RequestUri.ToString();
                Debug.WriteLine($"Post-flight request URL: {platformResponse.Url}");
                platformResponse.Timestamp      = DateTimeOffset.UtcNow;
                platformResponse.HttpStatusCode = sendResult.StatusCode;
                Debug.WriteLine($"Status Code: {platformResponse.HttpStatusCode}");

                try
                {
                    var cookie = (from h in sendResult.Headers where h.Key == "Set-Cookie" select h.Value.FirstOrDefault()).FirstOrDefault();
                    if (cookie != null)
                    {
                        platformResponse.ARRAffinityInstance = (from c in cookie.Split(';') where c.StartsWith("") select c.Split('=').LastOrDefault()).FirstOrDefault();
                    }
                }
                catch (Exception)
                {
                }

                if (sendResult.IsSuccessStatusCode)
                {
                    monitor.Report("Received Successful StatusCode", 0.8);
                    if (cancellationToken.IsCancellationRequested)
                    {
                        platformResponse.WasCancelled = true;
                        monitor.Report("Operation Cancelled", 0.9);
                        return(platformResponse);
                    }

                    monitor.Report("Reading data from Response", 0.9);
                    var json = await sendResult.Content.ReadAsStringAsync();

                    monitor.Report("Deserializing data", 0.95);
                    try
                    {
                        platformResponse.Response = _serializer.Deserialize <T>(json);
                        if (platformResponse.Response != null)
                        {
                            platformResponse.Success = true;
                        }
                    }
                    catch (Exception e)
                    {
                        _log.Error(e, "Invalid response from the server. Received:{0}, expected:{1}.  Will continue.", json, typeof(T));
                    }

                    if (typeof(T) == typeof(IAuthorization))
                    {
                        monitor.Report("Setting internal auth token", 0.99);
                        Authorization.MojioApiToken = (platformResponse.Response as IAuthorization).AccessToken;
                        _container.RegisterInstance(Authorization, "Session");
                    }
                }
                else
                {
                    monitor.Report("Received Unsuccessful StatusCode", 0.8);

                    platformResponse.Success      = false;
                    platformResponse.ErrorCode    = sendResult.StatusCode.ToString();
                    platformResponse.ErrorMessage = sendResult.ReasonPhrase;

                    monitor.Report("Reading data from Response", 0.9);
                    var content = await sendResult.Content.ReadAsStringAsync();

                    Debug.WriteLine(content);
                    Debug.WriteLine(_serializer.SerializeToString(request));

                    if (!string.IsNullOrEmpty(content))
                    {
                        try
                        {
                            monitor.Report("Deserializing data", 0.95);
                            dynamic result = _serializer.Deserialize(content);
                            if (result != null)
                            {
                                if (result.Message != null)
                                {
                                    platformResponse.ErrorMessage = platformResponse.ErrorMessage + ", " + result.Message;
                                }
                                else
                                {
                                    platformResponse.ErrorMessage = platformResponse.ErrorMessage + ", " + content;
                                }
                            }
                        }
                        catch (Exception)
                        {
                        }
                    }
                }
            }
            monitor.Report("Finished", 1);

            monitor.Stop();

            return(platformResponse);
        }
示例#14
0
        public async Task <IDeployment> Start(IDIContainer rootContainer, IDictionary <string, object> environment = null)
        {
            var id = Guid.NewGuid().ToString();

            if (environment != null)
            {
                if (environment.ContainsKey("id"))
                {
                    id = environment["id"].ToString();
                }
            }

            rootContainer.RegisterInstance(rootContainer);
            rootContainer.RegisterInstance(rootContainer as IRegister);
            rootContainer.RegisterInstance(rootContainer as IResolve);

            if (environment != null)
            {
                rootContainer.RegisterInstance(environment, "environment");
                foreach (var key in environment.Keys)
                {
                    rootContainer.RegisterInstance(environment[key], "environment." + key);
                }
            }

            IDeployment deployment = null;

            if (environment != null && environment.ContainsKey("Deployment"))
            {
                deployment = environment["Deployment"] as IDeployment;
            }
            else if (rootContainer.IsRegistered <IConfiguration>())
            {
                var config       = rootContainer.Resolve <IConfiguration>();
                var deployConfig = config.GetValue <string>("Deployment");
                if (!string.IsNullOrEmpty(deployConfig))
                {
                    var type = rootContainer.GetTypeByModuleName(deployConfig);
                    if (type != null)
                    {
                        deployment = type.Assembly.CreateInstance(type.FullName, false) as IDeployment;
                    }
                }
            }

            if (deployment == null)
            {
                deployment = new DefaultDeployment();
            }

            await deployment.Start(rootContainer, environment);

            while (!_activeDeployments.TryAdd(id, deployment))
            {
                await Task.Delay(1);
            }
            rootContainer.RegisterInstance(deployment);

            Started = true;
            return(deployment);
        }
        private void RegisterSDKDomain(IDIContainer container)
        {
            container.Register<IUser, User>();
            container.Register<ITelephoneNumber, TelephoneNumber>();
            container.Register<IVehicle, Vehicle>();
            container.Register<IClient, Client>();
            container.Register<IClientApp, Client>();
            container.Register<IClientLogin, Client>();
            container.Register<IClientMe, Client>();
            container.Register<IClientTrip, Client>();
            container.Register<IClientMojio, Client>();
            container.Register<IClientVehicle, Client>();
            container.Register<IMachineRequest, MachineRequest>();

            container.Register<IImage, Image>();
            container.Register<IEmail, Email>();

            container.Register<IAccelerometer, Accelerometer>();
            container.Register<IAddress, Address>();
            container.Register<IBattery, Battery>();
            container.Register<IDiagnosticCode, DiagnosticCode>();
            container.Register<IHeading, Heading>();
            container.Register<ILocation, Location>();
            container.Register<IVirtualodometer, VirtualOdometer>();
            container.Register<IMeasurement, Measurement>();
            container.Register<IOdometer, Odometer>();
            container.Register<IRiskMeasurement, RiskMeasurement>();
            container.Register<IState, State>();
            container.Register<IVehiclesResponse, VehiclesResponse>();
            container.Register<IVinCommon, VinCommon>();
            container.Register<IVinDetails, VinDetails>();
            container.Register<IVinSummary, VinSummary>();
            container.Register<ITransmission, Transmission>();

            container.Register<ITripsResponse, TripsResponse>();
            container.Register<ITrip, Trip>();

            container.Register<IMojioResponse, MojioResponse>();
            container.Register<IMojio, Mojio>();

            container.Register<IEngine, Engine>();
            container.Register<IEngine, Engine>();
            container.Register<IWarranty, Warranty>();
            container.Register<IServiceBulletin, ServiceBulletin>();
            container.Register<IRecall, Recall>();
            container.Register<IServiceScheduleResponse, ServiceScheduleResponse>();
            container.Register<IService, Service>();

            container.Register<IApp, App>();
            container.Register<IAppResponse, AppResponse>();
            container.Register<IMessageResponse, MessageResponse>();

            container.Register<IVehicleLocationResponse, VehicleLocationResponse>();

            container.Register<IMachineStates, MachineStates>();
            container.Register<IMinMax, MinMax>();
            container.Register<IPoints, Points>();
            container.Register<IVehicleState, VehicleState>();
            container.Register<IMachineTelematicDevice, MachineTelematicDevice>();
            container.Register<IMachine, HttpMachine>();

            container.Register<ITransport, BaseTransport>();
            container.Register<ITransport, AndroidTransport>("Android");
            container.Register<ITransport, AppleTransport>("Apple");
            container.Register<ITransport, HttpPostTransport>("HttpPost");
            container.Register<ITransport, MongoDBTransport>("MongoDB");
            container.Register<ITransport, MqttTransport>("Mqtt");
            container.Register<ITransport, SignalRTransport>("SignalR");
            container.Register<ITransport, EventHubTransport>("EventHub");
            container.Register<ITransport, ServiceBusQueueTransport>("ServiceBusQueue");

            container.Register<AndroidTransport, AndroidTransport>();
            container.Register<AppleTransport, AppleTransport>();
            container.Register<HttpPostTransport, HttpPostTransport>();
            container.Register<MongoDBTransport, MongoDBTransport>();
            container.Register<MqttTransport, MqttTransport>();
            container.Register<SignalRTransport, SignalRTransport>();
            container.Register<EventHubTransport, EventHubTransport>();
            container.Register<ServiceBusQueueTransport, ServiceBusQueueTransport>();

            container.Register<IAndroidTransport, AndroidTransport>();
            container.Register<IAppleTransport, AppleTransport>();
            container.Register<IHttpPostTransport, HttpPostTransport>();
            container.Register<IMongoDBTransport, MongoDBTransport>();
            container.Register<IMqttTransport, MqttTransport>();
            container.Register<ISignalRTransport, SignalRTransport>();
            container.Register<IEventHubTransport, EventHubTransport>();
            container.Register<IServiceBusQueueTransport, ServiceBusQueueTransport>();

            container.Register<ITransportFactory, TransportFactory>();
            container.Register<IPushObserverResponse, PushObserverResponse>();
            container.Register<IPushObserver, PushObserverRequest>();

            container.Register<IGroup, Group>();
            container.Register<IGroupResponse, GroupResponse>();

            container.Register(typeof(IObservable<>), typeof(SimpleObservable<>));

            var vehicles = container.Resolve<IObservable<IVehicle>>();
            container.RegisterInstance<IObservable<IVehicle>>(vehicles);

            var activities = container.Resolve<IObservable<IActivity>>();
            container.RegisterInstance<IObservable<IActivity>>(activities);

            var mojios = container.Resolve<IObservable<IMojio>>();
            container.RegisterInstance<IObservable<IMojio>>(mojios);

            RegisterActivityStreams(container);
        }
示例#16
0
        private void BuildConfiguration(string root)
        {
            var builder = new ConfigurationBuilder();

            builder.SetBasePath(root);
#if TRACE
            Trace.WriteLine(EntryPoint + ": " + "SetBasePath:" + root);
#endif
            //stage 2.4
            builder.AddEnvironmentVariables();

            builder.AddJsonFile(System.IO.Path.Combine(root, "appsettings.json"), true, false); //appsettings.json

            //stage 2.5
            builder.AddJsonFile(GetConfigFile(null), true, false); //appsettings.json

            //stage 2.6
            builder.AddJsonFile(GetConfigFile(Environment), true, false); //appsettings.%ENVIRONMENT%.json

            //stage 2.7
            builder.AddJsonFile(GetConfigFile(Environment, cloudServices: true), true,
                                false); //appsettings.CloudServices.%ENVIRONMENT%.json

            //stage 2.8
            builder.AddJsonFile(GetConfigFile(Environment, HostEnvironment), true,
                                false); //appsettings.%HOSTINGENVIRONMENT%.json

            //stage 2.9
            builder.AddJsonFile(GetConfigFile(Environment, HostEnvironment, true), true,
                                false); //appsettings.CloudServices.%HOSTINGENVIRONMENT%.json

            //stage 2.10
            var host = System.Environment.GetEnvironmentVariable("Host");
            if (!string.IsNullOrEmpty(host))
            {
                builder.AddJsonFile(GetConfigForHost(host), true, false);              //appsettings.%HOST%.json
                builder.AddJsonFile(GetConfigForHost(host, Environment), true, false); //appsettings.%HOST%.json
                builder.AddJsonFile(GetConfigForHost(host, Environment, HostEnvironment), true,
                                    false);                                            //appsettings.%HOST%.json
            }

            //stage 2.11
            builder.AddJsonFile(GetConfigFile("machine." + System.Environment.MachineName, isEnvironmentName: false),
                                true, false); //appsettings.machine.%MACHINENAME%.json

            SetupVersion();
            SetupUnitTest();
            SetupAppDataDirectory();
            InitializeUnitTestAppSettings(builder);
            InitializeAdditionalSettings(builder, root);

            ConfigurationRoot = builder.Build();

#if TRACE
            BuildAndDumpConfig(ConfigurationRoot);
#endif

            _container.RegisterInstance(ConfigurationRoot, typeof(IConfigurationRoot));

            IsReady = true;
        }