/// <summary>
        /// Initializes the AppHost.
        /// Calls the <see cref="Configure"/> method.
        /// Should be called before start.
        /// </summary>
        public virtual ServiceStackHost Init()
        {
            if (Instance != null)
            {
                throw new InvalidDataException($"ServiceStackHost.Instance has already been set ({Instance.GetType().Name})");
            }

            Service.GlobalResolver = Instance = this;

            Config = HostConfig.ResetInstance();
            OnConfigLoad();

            AbstractVirtualFileBase.ScanSkipPaths = Config.ScanSkipPaths;
            ResourceVirtualDirectory.EmbeddedResourceTreatAsFiles = Config.EmbeddedResourceTreatAsFiles;

            Config.DebugMode = GetType().GetAssembly().IsDebugBuild();
            if (Config.DebugMode)
            {
                Plugins.Add(new RequestInfoFeature());
            }

            OnBeforeInit();
            ServiceController.Init();
            Configure(Container);

            if (Config.StrictMode == null && Config.DebugMode)
            {
                Config.StrictMode = true;
            }

            ConfigurePlugins();

            List <IVirtualPathProvider> pathProviders = null;

            if (VirtualFileSources == null)
            {
                pathProviders = GetVirtualFileSources().Where(x => x != null).ToList();

                VirtualFileSources = pathProviders.Count > 1
                    ? new MultiVirtualFiles(pathProviders.ToArray())
                    : pathProviders.First();
            }

            if (VirtualFiles == null)
            {
                VirtualFiles = pathProviders?.FirstOrDefault(x => x is FileSystemVirtualFiles) as IVirtualFiles
                               ?? GetVirtualFileSources().FirstOrDefault(x => x is FileSystemVirtualFiles) as IVirtualFiles;
            }

            OnAfterInit();

            LogInitComplete();

            HttpHandlerFactory.Init();

            return(this);
        }
        /// <summary>
        /// Initializes the AppHost.
        /// Calls the <see cref="Configure"/> method.
        /// Should be called before start.
        /// </summary>
        public virtual ServiceStackHost Init()
        {
            if (Instance != null)
            {
                throw new InvalidDataException($"ServiceStackHost.Instance has already been set ({Instance.GetType().Name})");
            }

            Service.GlobalResolver = Instance = this;

            RegisterLicenseKey(AppSettings.GetNullableString("servicestack:license"));

            if (ServiceController == null)
            {
                ServiceController = CreateServiceController(ServiceAssemblies.ToArray());
            }

            Config = HostConfig.ResetInstance();
            OnConfigLoad();

            AbstractVirtualFileBase.ScanSkipPaths = Config.ScanSkipPaths;
            ResourceVirtualDirectory.EmbeddedResourceTreatAsFiles = Config.EmbeddedResourceTreatAsFiles;

            OnBeforeInit();
            ServiceController.Init();

            BeforeConfigure.Each(fn => fn(this));
            Configure(Container);
            AfterConfigure.Each(fn => fn(this));

            if (Config.StrictMode == null && Config.DebugMode)
            {
                Config.StrictMode = true;
            }

            if (!Config.DebugMode)
            {
                Plugins.RemoveAll(x => x is RequestInfoFeature);
            }

            ConfigurePlugins();

            List <IVirtualPathProvider> pathProviders = null;

            if (VirtualFileSources == null)
            {
                pathProviders = GetVirtualFileSources().Where(x => x != null).ToList();

                VirtualFileSources = pathProviders.Count > 1
                    ? new MultiVirtualFiles(pathProviders.ToArray())
                    : pathProviders.First();
            }

            if (VirtualFiles == null)
            {
                VirtualFiles = pathProviders?.FirstOrDefault(x => x is FileSystemVirtualFiles) as IVirtualFiles
                               ?? GetVirtualFileSources().FirstOrDefault(x => x is FileSystemVirtualFiles) as IVirtualFiles;
            }

            OnAfterInit();

            PopulateArrayFilters();

            LogInitComplete();

            HttpHandlerFactory.Init();

            return(this);
        }
Example #3
0
        /// <summary>
        /// Initializes the AppHost.
        /// Calls the <see cref="Configure"/> method.
        /// Should be called before start.
        /// </summary>
        public virtual ServiceStackHost Init()
        {
            if (Instance != null)
            {
                throw new InvalidDataException($"ServiceStackHost.Instance has already been set ({Instance.GetType().Name})");
            }

            Service.GlobalResolver = Instance = this;

            //RegisterLicenseKey(AppSettings.GetNullableString("servicestack:license"));

            var scanAssemblies = new List <Assembly>(ServiceAssemblies);

            scanAssemblies.AddIfNotExists(GetType().Assembly);
            //var scanTypes = scanAssemblies.SelectMany(x => x.GetTypes())
            //    .Where(x => (x.HasInterface(typeof(IPreConfigureAppHost))
            //                 || x.HasInterface(typeof(IConfigureAppHost))
            //                 || x.HasInterface(typeof(IAfterInitAppHost))))
            //    .ToArray();

            //var startupConfigs = scanTypes.Where(x => !x.HasInterface(typeof(IPlugin)))
            //    .Select(x => x.CreateInstance()).WithPriority();
            //var configInstances = startupConfigs.PriorityOrdered();
            //var preStartupConfigs = startupConfigs.PriorityBelowZero();
            //var postStartupConfigs = startupConfigs.PriorityZeroOrAbove();

            //void RunPreConfigure(object instance)
            //{
            //    try
            //    {
            //        if (instance is IPreConfigureAppHost preConfigureAppHost)
            //            preConfigureAppHost.PreConfigure(this);
            //    }
            //    catch (Exception ex)
            //    {
            //        OnStartupException(ex);
            //    }
            //}
            //var priorityPlugins = Plugins.WithPriority().PriorityOrdered().Map(x => (IPlugin)x);
            //priorityPlugins.ForEach(RunPreConfigure);
            //configInstances.ForEach(RunPreConfigure);

            if (ServiceController == null)
            {
                ServiceController = CreateServiceController(ServiceAssemblies.ToArray());
            }

            Config = HostConfig.ResetInstance();
            OnConfigLoad();

            //AbstractVirtualFileBase.ScanSkipPaths = Config.ScanSkipPaths;
            //ResourceVirtualDirectory.EmbeddedResourceTreatAsFiles = Config.EmbeddedResourceTreatAsFiles;

            OnBeforeInit();
            ServiceController.Init();

            //void RunConfigure(object instance)
            //{
            //    try
            //    {
            //        //if (instance is IConfigureAppHost configureAppHost)
            //            //configureAppHost.Configure(this);
            //    }
            //    catch (Exception ex)
            //    {
            //        OnStartupException(ex);
            //    }
            //}
            //preStartupConfigs.ForEach(RunConfigure);
            //BeforeConfigure.Each(fn => fn(this));

            Configure(Container);

            //AfterConfigure.Each(fn => fn(this));

            //postStartupConfigs.ForEach(RunConfigure);

            if (Config.StrictMode == null && Config.DebugMode)
            {
                Config.StrictMode = true;
            }

            //if (!Config.DebugMode)
            //    Plugins.RemoveAll(x => x is RequestInfoFeature);

            //Some plugins need to initialize before other plugins are registered.
            Plugins.ToList().ForEach(RunPreInitPlugin);
            //configInstances.ForEach(RunPreInitPlugin);

            List <IVirtualPathProvider> pathProviders = null;

            if (VirtualFileSources == null)
            {
                pathProviders = GetVirtualFileSources().Where(x => x != null).ToList();

                //VirtualFileSources = pathProviders.Count > 1
                //    ? new MultiVirtualFiles(pathProviders.ToArray())
                //    : pathProviders.First();
            }

            //if (VirtualFiles == null)
            //    VirtualFiles = pathProviders?.FirstOrDefault(x => x is FileSystemVirtualFiles) as IVirtualFiles
            //        ?? GetVirtualFileSources().FirstOrDefault(x => x is FileSystemVirtualFiles) as IVirtualFiles;

            OnAfterInit();

            //configInstances.ForEach(RunPostInitPlugin);

            PopulateArrayFilters();

            LogInitComplete();

            HttpHandlerFactory.Init();

            foreach (var callback in AfterInitCallbacks)
            {
                callback(this);
            }

            Plugins.ForEach(RunAfterInitAppHost);
            //configInstances.ForEach(RunAfterInitAppHost);

            ReadyAt = DateTime.UtcNow;

            return(this);
        }
        //After configure called
        public virtual void InitFinal()
        {
            if (Config.EnableFeatures != Feature.All)
            {
                if ((Feature.Xml & Config.EnableFeatures) != Feature.Xml)
                {
                    Config.IgnoreFormatsInMetadata.Add("xml");
                    Config.PreferredContentTypes.Remove(MimeTypes.Xml);
                }
                if ((Feature.Json & Config.EnableFeatures) != Feature.Json)
                {
                    Config.IgnoreFormatsInMetadata.Add("json");
                    Config.PreferredContentTypes.Remove(MimeTypes.Json);
                }
                if ((Feature.Jsv & Config.EnableFeatures) != Feature.Jsv)
                {
                    Config.IgnoreFormatsInMetadata.Add("jsv");
                    Config.PreferredContentTypes.Remove(MimeTypes.Jsv);
                }
                if ((Feature.Csv & Config.EnableFeatures) != Feature.Csv)
                {
                    Config.IgnoreFormatsInMetadata.Add("csv");
                    Config.PreferredContentTypes.Remove(MimeTypes.Csv);
                }
                if ((Feature.Html & Config.EnableFeatures) != Feature.Html)
                {
                    Config.IgnoreFormatsInMetadata.Add("html");
                    Config.PreferredContentTypes.Remove(MimeTypes.Html);
                }
                if ((Feature.Soap11 & Config.EnableFeatures) != Feature.Soap11)
                {
                    Config.IgnoreFormatsInMetadata.Add("soap11");
                }
                if ((Feature.Soap12 & Config.EnableFeatures) != Feature.Soap12)
                {
                    Config.IgnoreFormatsInMetadata.Add("soap12");
                }
            }

            if ((Feature.Html & Config.EnableFeatures) != Feature.Html)
            {
                Plugins.RemoveAll(x => x is HtmlFormat);
            }

            if ((Feature.Csv & Config.EnableFeatures) != Feature.Csv)
            {
                Plugins.RemoveAll(x => x is CsvFormat);
            }

            if ((Feature.PredefinedRoutes & Config.EnableFeatures) != Feature.PredefinedRoutes)
            {
                Plugins.RemoveAll(x => x is PredefinedRoutesFeature);
            }

            if ((Feature.Metadata & Config.EnableFeatures) != Feature.Metadata)
            {
                Plugins.RemoveAll(x => x is MetadataFeature);
                Plugins.RemoveAll(x => x is NativeTypesFeature);
            }

            if ((Feature.RequestInfo & Config.EnableFeatures) != Feature.RequestInfo)
            {
                Plugins.RemoveAll(x => x is RequestInfoFeature);
            }

            if ((Feature.Razor & Config.EnableFeatures) != Feature.Razor)
            {
                Plugins.RemoveAll(x => x is IRazorPlugin);    //external
            }
            if ((Feature.ProtoBuf & Config.EnableFeatures) != Feature.ProtoBuf)
            {
                Plugins.RemoveAll(x => x is IProtoBufPlugin); //external
            }
            if ((Feature.MsgPack & Config.EnableFeatures) != Feature.MsgPack)
            {
                Plugins.RemoveAll(x => x is IMsgPackPlugin);  //external
            }
            var plugins = Plugins.ToArray();

            delayLoadPlugin = true;
            LoadPluginsInternal(plugins);

            AfterPluginsLoaded();

            Metadata.Config.IgnoreFormats = Config.IgnoreFormatsInMetadata;

            if (!TestMode && Container.Exists <IAuthSession>())
            {
                throw new Exception(ErrorMessages.ShouldNotRegisterAuthSession);
            }

            if (!Container.Exists <ICacheClient>())
            {
                if (Container.Exists <IRedisClientsManager>())
                {
                    Container.Register(c => c.Resolve <IRedisClientsManager>().GetCacheClient());
                }
                else
                {
                    Container.Register <ICacheClient>(new MemoryCacheClient());
                }
            }

            if (!Container.Exists <MemoryCacheClient>())
            {
                Container.Register(new MemoryCacheClient());
            }

            if (Container.Exists <IMessageService>() &&
                !Container.Exists <IMessageFactory>())
            {
                Container.Register(c => c.Resolve <IMessageService>().MessageFactory);
            }

            if (Container.Exists <IUserAuthRepository>() &&
                !Container.Exists <IAuthRepository>())
            {
                Container.Register <IAuthRepository>(c => c.Resolve <IUserAuthRepository>());
            }

            if (Config.UseJsObject)
            {
                JS.Configure();
            }

            if (Config.LogUnobservedTaskExceptions)
            {
                TaskScheduler.UnobservedTaskException += (sender, args) =>
                {
                    args.SetObserved();
                    args.Exception.Handle(ex =>
                    {
                        lock (AsyncErrors)
                        {
                            AsyncErrors.Add(DtoUtils.CreateErrorResponse(null, ex).GetResponseStatus());
                            return(true);
                        }
                    });
                };
            }

            foreach (var callback in AfterInitCallbacks)
            {
                callback(this);
            }
            ////Register any routes configured on Routes
            //foreach (var restPath in Routes)
            //{
            //    ServiceController.RegisterRestPath(restPath);

            //    //Auto add Route Attributes so they're available in T.ToUrl() extension methods
            //    restPath.RequestType
            //        .AddAttributes(new RouteAttribute(restPath.Path, restPath.AllowedVerbs)
            //        {
            //            Priority = restPath.Priority,
            //            Summary = restPath.Summary,
            //            Notes = restPath.Notes,
            //        });
            //}

            HttpHandlerFactory.Init();
        }