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);
}