diff --git a/src/AddIns/Analysis/UnitTesting/Src/RunTestCommandContext.cs b/src/AddIns/Analysis/UnitTesting/Src/RunTestCommandContext.cs
index 23f16cec3e..4e7ea06e68 100644
--- a/src/AddIns/Analysis/UnitTesting/Src/RunTestCommandContext.cs
+++ b/src/AddIns/Analysis/UnitTesting/Src/RunTestCommandContext.cs
@@ -3,6 +3,7 @@
using System;
using ICSharpCode.Core.Services;
+using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
@@ -19,7 +20,7 @@ namespace ICSharpCode.UnitTesting
MessageViewCategory unitTestCategory = TestService.UnitTestMessageView;
UnitTestMessageService messageService = new UnitTestMessageService();
UnitTestSaveAllFilesCommand saveAllFilesCommand = new UnitTestSaveAllFilesCommand();
- IStatusBarService statusBarService = WorkbenchSingleton.StatusBar;
+ IStatusBarService statusBarService = SD.StatusBar;
public IRegisteredTestFrameworks RegisteredTestFrameworks {
get { return testFrameworks; }
diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
index 5a45ee3c88..5886060035 100644
--- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
+++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
@@ -401,6 +401,7 @@
+
@@ -796,7 +797,7 @@
-
+
diff --git a/src/Main/Base/Project/Src/Gui/WorkbenchSingleton.cs b/src/Main/Base/Project/Src/Gui/WorkbenchSingleton.cs
index ad7d0e47cd..95efe4d240 100644
--- a/src/Main/Base/Project/Src/Gui/WorkbenchSingleton.cs
+++ b/src/Main/Base/Project/Src/Gui/WorkbenchSingleton.cs
@@ -54,6 +54,7 @@ namespace ICSharpCode.SharpDevelop.Gui
}
}
+ [Obsolete("Use SD.StatusBar instead")]
public static IStatusBarService StatusBar {
get {
return workbench != null ? workbench.StatusBar : null;
diff --git a/src/Main/Base/Project/Src/Services/SD.cs b/src/Main/Base/Project/Src/Services/SD.cs
new file mode 100644
index 0000000000..7cd6e6e13f
--- /dev/null
+++ b/src/Main/Base/Project/Src/Services/SD.cs
@@ -0,0 +1,71 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+
+using System;
+using System.ComponentModel.Design;
+using ICSharpCode.Core;
+using ICSharpCode.Core.Services;
+using ICSharpCode.SharpDevelop.Gui;
+
+namespace ICSharpCode.SharpDevelop
+{
+ ///
+ /// Static entry point for retrieving SharpDevelop services.
+ ///
+ public static class SD
+ {
+ ///
+ /// Gets the main service container for SharpDevelop.
+ ///
+ public static IServiceContainer Services {
+ get { return GetRequiredService(); }
+ }
+
+ ///
+ /// Gets a service. Returns null if service is not found.
+ ///
+ public static T GetService() where T : class
+ {
+ return ServiceManager.Instance.GetService();
+ }
+
+ ///
+ /// Gets a service. Returns null if service is not found.
+ ///
+ public static T GetRequiredService() where T : class
+ {
+ return ServiceManager.Instance.GetRequiredService();
+ }
+
+ ///
+ /// Gets the workbench.
+ ///
+ public static IWorkbench Workbench {
+ get {
+ var workbench = WorkbenchSingleton.Workbench;
+ if (workbench == null)
+ throw new ServiceNotFoundException("Workbench");
+ return workbench;
+ }
+ }
+
+ ///
+ /// Gets the status bar.
+ ///
+ public static IStatusBarService StatusBar {
+ get { return Workbench.StatusBar; }
+ }
+
+ public static ILoggingService LoggingService {
+ get { return GetRequiredService(); }
+ }
+
+ public static IMessageService MessageService {
+ get { return GetRequiredService(); }
+ }
+
+ public static IAnalyticsMonitor AnalyticsMonitor {
+ get { return GetRequiredService(); }
+ }
+ }
+}
diff --git a/src/Main/Base/Project/Src/Util/ThreadSafeServiceContainer.cs b/src/Main/Base/Project/Src/Util/ThreadSafeServiceContainer.cs
new file mode 100644
index 0000000000..eb51427c90
--- /dev/null
+++ b/src/Main/Base/Project/Src/Util/ThreadSafeServiceContainer.cs
@@ -0,0 +1,115 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+
+using System;
+using System.ComponentModel.Design;
+using System.Linq;
+using System.Collections.Generic;
+
+namespace ICSharpCode.SharpDevelop
+{
+ ///
+ /// A thread-safe service container class.
+ ///
+ public class ThreadSafeServiceContainer : IServiceProvider, IServiceContainer, IDisposable
+ {
+ Dictionary services = new Dictionary();
+
+ public ThreadSafeServiceContainer()
+ {
+ services.Add(typeof(ThreadSafeServiceContainer), this);
+ services.Add(typeof(IServiceContainer), this);
+ }
+
+ public object GetOrCreateService(Type type, Func