diff --git a/src/ServiceHost/Hosting/ServiceHost.cs b/src/ServiceHost/Hosting/ServiceHost.cs index 1a499ea6..f8808af6 100644 --- a/src/ServiceHost/Hosting/ServiceHost.cs +++ b/src/ServiceHost/Hosting/ServiceHost.cs @@ -3,6 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +using System; using System.Threading.Tasks; using System.Collections.Generic; using System.Linq; @@ -16,14 +17,14 @@ namespace Microsoft.SqlTools.ServiceLayer.Hosting /// /// SQL Tools VS Code Language Server request handler /// - public class ServiceHost : ServiceHostBase + public sealed class ServiceHost : ServiceHostBase { #region Singleton Instance Code /// - /// Singleton instance of the instance + /// Singleton instance of the service host for internal storage /// - private static ServiceHost instance; + private static readonly Lazy instance = new Lazy(() => new ServiceHost()); /// /// Creates or retrieves the current instance of the ServiceHost @@ -31,11 +32,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Hosting /// Instance of the service host public static ServiceHost Create() { - if (instance == null) - { - instance = new ServiceHost(); - } - return instance; + return instance.Value; } /// diff --git a/src/ServiceHost/LanguageServices/LanguageService.cs b/src/ServiceHost/LanguageServices/LanguageService.cs index 51edcad4..05f42fb3 100644 --- a/src/ServiceHost/LanguageServices/LanguageService.cs +++ b/src/ServiceHost/LanguageServices/LanguageService.cs @@ -20,32 +20,23 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices /// /// Main class for Language Service functionality /// - public class LanguageService + public sealed class LanguageService { #region Singleton Instance Implementation - private static LanguageService instance; + private static readonly Lazy instance = new Lazy(() => new LanguageService()); public static LanguageService Instance { - get - { - if (instance == null) - { - instance = new LanguageService(); - } - return instance; - } + get { return instance.Value; } } /// - /// Default, parameterless contstructor. - /// TODO: Remove once the SqlToolsContext stuff is sorted out + /// Default, parameterless constructor. /// private LanguageService() { - } #endregion diff --git a/src/ServiceHost/WorkspaceServices/WorkspaceService.cs b/src/ServiceHost/WorkspaceServices/WorkspaceService.cs index 2fd3e48c..7be53481 100644 --- a/src/ServiceHost/WorkspaceServices/WorkspaceService.cs +++ b/src/ServiceHost/WorkspaceServices/WorkspaceService.cs @@ -15,23 +15,16 @@ using System.Linq; namespace Microsoft.SqlTools.ServiceLayer.WorkspaceServices { - public class WorkspaceService where TConfig : new() + public class WorkspaceService where TConfig : class, new() { #region Singleton Instance Implementation - private static WorkspaceService instance; + private static readonly Lazy> instance = new Lazy>(() => new WorkspaceService()); public static WorkspaceService Instance { - get - { - if (instance == null) - { - instance = new WorkspaceService(); - } - return instance; - } + get { return instance.Value; } } private WorkspaceService() @@ -52,9 +45,8 @@ namespace Microsoft.SqlTools.ServiceLayer.WorkspaceServices public delegate Task DidChangeTextDocumentNotificationTask(ScriptFile[] changedFiles, EventContext eventContext); - public List ConfigurationNotificationHandlers; - public List TextDocumentChangeHandlers; - + private List ConfigurationNotificationHandlers { get; set; } + private List TextDocumentChangeHandlers { get; set; } #endregion @@ -153,7 +145,7 @@ namespace Microsoft.SqlTools.ServiceLayer.WorkspaceServices Logger.Write(LogLevel.Verbose, msg.ToString()); - var handlers = TextDocumentChangeHandlers.Select(t => t(changedFiles.ToArray(), eventContext)).ToArray(); + var handlers = TextDocumentChangeHandlers.Select(t => t(changedFiles.ToArray(), eventContext)); return Task.WhenAll(handlers); } @@ -186,7 +178,7 @@ namespace Microsoft.SqlTools.ServiceLayer.WorkspaceServices // Propagate the changes to the event handlers var configUpdateTasks = ConfigurationNotificationHandlers.Select( - t => t(configChangeParams.Settings, CurrentSettings, eventContext)).ToArray(); + t => t(configChangeParams.Settings, CurrentSettings, eventContext)); await Task.WhenAll(configUpdateTasks); }