diff --git a/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/SqlProjectsService.cs b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/SqlProjectsService.cs
index 091fb90b..eafec25e 100644
--- a/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/SqlProjectsService.cs
+++ b/src/Microsoft.SqlTools.ServiceLayer/SqlProjects/SqlProjectsService.cs
@@ -18,7 +18,7 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
///
/// Main class for SqlProjects service
///
- class SqlProjectsService
+ public sealed class SqlProjectsService : BaseService
{
private static readonly Lazy instance = new Lazy(() => new SqlProjectsService());
@@ -216,74 +216,6 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlProjects
#region Helper methods
- ///
- /// Synchronous action with standard ResultStatus
- ///
- ///
- ///
- ///
- private async Task RunWithErrorHandling(Action action, RequestContext requestContext)
- {
- await RunWithErrorHandling(async () => await Task.Run(action), requestContext);
- }
-
- ///
- /// Asynchronous action with standard ResultStatus
- ///
- ///
- ///
- ///
- private async Task RunWithErrorHandling(Func action, RequestContext requestContext)
- {
- await RunWithErrorHandling(async () =>
- {
- await action();
-
- return new ResultStatus()
- {
- Success = true,
- ErrorMessage = null
- };
- }, requestContext);
- }
-
-
- ///
- /// Synchronous action with custom result
- ///
- ///
- ///
- ///
- ///
- private async Task RunWithErrorHandling(Func action, RequestContext requestContext) where T : ResultStatus, new()
- {
- await RunWithErrorHandling(async () => await Task.Run(action), requestContext);
- }
-
- ///
- /// Asynchronous action with custom result
- ///
- ///
- ///
- ///
- ///
- private async Task RunWithErrorHandling(Func> action, RequestContext requestContext) where T : ResultStatus, new()
- {
- try
- {
- T result = await action();
- await requestContext.SendResult(result);
- }
- catch (Exception ex)
- {
- await requestContext.SendResult(new T()
- {
- Success = false,
- ErrorMessage = ex.Message
- });
- }
- }
-
private SqlProject GetProject(string projectUri)
{
if (!Projects.ContainsKey(projectUri))
diff --git a/src/Microsoft.SqlTools.ServiceLayer/Utility/BaseService.cs b/src/Microsoft.SqlTools.ServiceLayer/Utility/BaseService.cs
new file mode 100644
index 00000000..142e9267
--- /dev/null
+++ b/src/Microsoft.SqlTools.ServiceLayer/Utility/BaseService.cs
@@ -0,0 +1,89 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+
+using System;
+using System.Threading.Tasks;
+using Microsoft.SqlTools.Hosting.Protocol;
+
+namespace Microsoft.SqlTools.ServiceLayer.Utility
+{
+ ///
+ /// Base class for services that contains helpful methods
+ ///
+ public abstract class BaseService
+ {
+ #region Runners with error handling
+
+ ///
+ /// Synchronous action with standard ResultStatus
+ ///
+ ///
+ ///
+ ///
+ public static async Task RunWithErrorHandling(Action action, RequestContext requestContext)
+ {
+ await RunWithErrorHandling(async () => await Task.Run(action), requestContext);
+ }
+
+ ///
+ /// Asynchronous action with standard ResultStatus
+ ///
+ ///
+ ///
+ ///
+ public static async Task RunWithErrorHandling(Func action, RequestContext requestContext)
+ {
+ await RunWithErrorHandling(async () =>
+ {
+ await action();
+
+ return new ResultStatus()
+ {
+ Success = true,
+ ErrorMessage = null
+ };
+ }, requestContext);
+ }
+
+
+ ///
+ /// Synchronous action with custom result
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task RunWithErrorHandling(Func action, RequestContext requestContext) where T : ResultStatus, new()
+ {
+ await RunWithErrorHandling(async () => await Task.Run(action), requestContext);
+ }
+
+ ///
+ /// Asynchronous action with custom result
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task RunWithErrorHandling(Func> action, RequestContext requestContext) where T : ResultStatus, new()
+ {
+ try
+ {
+ T result = await action();
+ await requestContext.SendResult(result);
+ }
+ catch (Exception ex)
+ {
+ await requestContext.SendResult(new T()
+ {
+ Success = false,
+ ErrorMessage = ex.Message
+ });
+ }
+ }
+
+ #endregion
+ }
+}