Browse Source

SD service container

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
fe6d77bedc
  1. 3
      src/AddIns/Analysis/UnitTesting/Src/RunTestCommandContext.cs
  2. 3
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  3. 1
      src/Main/Base/Project/Src/Gui/WorkbenchSingleton.cs
  4. 71
      src/Main/Base/Project/Src/Services/SD.cs
  5. 115
      src/Main/Base/Project/Src/Util/ThreadSafeServiceContainer.cs
  6. 64
      src/Main/Base/Project/Src/Util/ThreadSafeServiceProvider.cs
  7. 3
      src/Main/Base/Test/WebReferences/WebReferenceTests.cs
  8. 6
      src/Main/Core/Project/Src/Services/ServiceManager.cs

3
src/AddIns/Analysis/UnitTesting/Src/RunTestCommandContext.cs

@ -3,6 +3,7 @@
using System; using System;
using ICSharpCode.Core.Services; using ICSharpCode.Core.Services;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
@ -19,7 +20,7 @@ namespace ICSharpCode.UnitTesting
MessageViewCategory unitTestCategory = TestService.UnitTestMessageView; MessageViewCategory unitTestCategory = TestService.UnitTestMessageView;
UnitTestMessageService messageService = new UnitTestMessageService(); UnitTestMessageService messageService = new UnitTestMessageService();
UnitTestSaveAllFilesCommand saveAllFilesCommand = new UnitTestSaveAllFilesCommand(); UnitTestSaveAllFilesCommand saveAllFilesCommand = new UnitTestSaveAllFilesCommand();
IStatusBarService statusBarService = WorkbenchSingleton.StatusBar; IStatusBarService statusBarService = SD.StatusBar;
public IRegisteredTestFrameworks RegisteredTestFrameworks { public IRegisteredTestFrameworks RegisteredTestFrameworks {
get { return testFrameworks; } get { return testFrameworks; }

3
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -401,6 +401,7 @@
<Compile Include="Src\Services\RefactoringService\FindReferenceService.cs" /> <Compile Include="Src\Services\RefactoringService\FindReferenceService.cs" />
<Compile Include="Src\Services\RefactoringService\TypeGraphNode.cs" /> <Compile Include="Src\Services\RefactoringService\TypeGraphNode.cs" />
<Compile Include="Src\Services\RefactoringService\TypeName.cs" /> <Compile Include="Src\Services\RefactoringService\TypeName.cs" />
<Compile Include="Src\Services\SD.cs" />
<Compile Include="Src\Services\Tasks\ErrorPainter.cs" /> <Compile Include="Src\Services\Tasks\ErrorPainter.cs" />
<Compile Include="Src\Services\Tasks\TagComment.cs" /> <Compile Include="Src\Services\Tasks\TagComment.cs" />
<Compile Include="Src\Services\Tasks\Task.cs" /> <Compile Include="Src\Services\Tasks\Task.cs" />
@ -796,7 +797,7 @@
<Compile Include="Src\Project\BuildTarget.cs" /> <Compile Include="Src\Project\BuildTarget.cs" />
<Compile Include="Src\Util\GenericConverter.cs" /> <Compile Include="Src\Util\GenericConverter.cs" />
<Compile Include="Src\Internal\Templates\TemplateLoadException.cs" /> <Compile Include="Src\Internal\Templates\TemplateLoadException.cs" />
<Compile Include="Src\Util\ThreadSafeServiceProvider.cs" /> <Compile Include="Src\Util\ThreadSafeServiceContainer.cs" />
<Compile Include="Src\Util\UnclosableStream.cs" /> <Compile Include="Src\Util\UnclosableStream.cs" />
<Compile Include="Src\Util\WeakCollection.cs" /> <Compile Include="Src\Util\WeakCollection.cs" />
<Compile Include="Src\Util\WindowsFormsPrinting.cs" /> <Compile Include="Src\Util\WindowsFormsPrinting.cs" />

1
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 { public static IStatusBarService StatusBar {
get { get {
return workbench != null ? workbench.StatusBar : null; return workbench != null ? workbench.StatusBar : null;

71
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
{
/// <summary>
/// Static entry point for retrieving SharpDevelop services.
/// </summary>
public static class SD
{
/// <summary>
/// Gets the main service container for SharpDevelop.
/// </summary>
public static IServiceContainer Services {
get { return GetRequiredService<IServiceContainer>(); }
}
/// <summary>
/// Gets a service. Returns null if service is not found.
/// </summary>
public static T GetService<T>() where T : class
{
return ServiceManager.Instance.GetService<T>();
}
/// <summary>
/// Gets a service. Returns null if service is not found.
/// </summary>
public static T GetRequiredService<T>() where T : class
{
return ServiceManager.Instance.GetRequiredService<T>();
}
/// <summary>
/// Gets the workbench.
/// </summary>
public static IWorkbench Workbench {
get {
var workbench = WorkbenchSingleton.Workbench;
if (workbench == null)
throw new ServiceNotFoundException("Workbench");
return workbench;
}
}
/// <summary>
/// Gets the status bar.
/// </summary>
public static IStatusBarService StatusBar {
get { return Workbench.StatusBar; }
}
public static ILoggingService LoggingService {
get { return GetRequiredService<ILoggingService>(); }
}
public static IMessageService MessageService {
get { return GetRequiredService<IMessageService>(); }
}
public static IAnalyticsMonitor AnalyticsMonitor {
get { return GetRequiredService<IAnalyticsMonitor>(); }
}
}
}

115
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
{
/// <summary>
/// A thread-safe service container class.
/// </summary>
public class ThreadSafeServiceContainer : IServiceProvider, IServiceContainer, IDisposable
{
Dictionary<Type, object> services = new Dictionary<Type, object>();
public ThreadSafeServiceContainer()
{
services.Add(typeof(ThreadSafeServiceContainer), this);
services.Add(typeof(IServiceContainer), this);
}
public object GetOrCreateService(Type type, Func<object> serviceCreator)
{
lock (services) {
object instance;
if (!services.TryGetValue(type, out instance)) {
instance = serviceCreator();
services.Add(type, instance);
}
return instance;
}
}
public void TryAddService(Type type, object instance)
{
lock (services) {
if (!services.ContainsKey(type))
services.Add(type, instance);
}
}
public object GetService(Type serviceType)
{
object instance;
lock (services) {
if (!services.TryGetValue(serviceType, out instance))
return null;
}
ServiceCreatorCallback callback = instance as ServiceCreatorCallback;
if (callback == null)
return instance;
object newInstance = callback(this, serviceType);
lock (services) {
if (services.TryGetValue(serviceType, out instance) && ReferenceEquals(instance, callback)) {
services[serviceType] = newInstance;
return newInstance;
}
}
// concurrent modification while running the callback (most likely another thread ran the callback first):
IDisposable disposable = newInstance as IDisposable;
if (disposable != null)
disposable.Dispose();
return GetService(serviceType); // retry
}
public void Dispose()
{
IDisposable[] disposables;
lock (services) {
disposables = services.Values.OfType<IDisposable>().ToArray();
services.Clear();
}
foreach (IDisposable disposable in disposables)
disposable.Dispose();
}
public void AddService(Type serviceType, object serviceInstance)
{
lock (services) {
services.Add(serviceType, serviceInstance);
}
}
public void AddService(Type serviceType, object serviceInstance, bool promote)
{
AddService(serviceType, serviceInstance);
}
public void AddService(Type serviceType, ServiceCreatorCallback callback)
{
lock (services) {
services.Add(serviceType, callback);
}
}
public void AddService(Type serviceType, ServiceCreatorCallback callback, bool promote)
{
AddService(serviceType, callback);
}
public void RemoveService(Type serviceType)
{
lock (services) {
services.Remove(serviceType);
}
}
public void RemoveService(Type serviceType, bool promote)
{
RemoveService(serviceType);
}
}
}

64
src/Main/Base/Project/Src/Util/ThreadSafeServiceProvider.cs

@ -1,64 +0,0 @@
// 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.Linq;
using System.Collections.Generic;
namespace ICSharpCode.SharpDevelop
{
/// <summary>
/// A thread-safe service container class.
/// </summary>
public class ThreadSafeServiceContainer : IServiceProvider, IDisposable
{
Dictionary<Type, object> services = new Dictionary<Type, object>();
public ThreadSafeServiceContainer()
{
services.Add(typeof(ThreadSafeServiceContainer), this);
}
public object GetOrCreateService(Type type, Func<object> serviceCreator)
{
lock (services) {
object instance;
if (!services.TryGetValue(type, out instance)) {
instance = serviceCreator();
services.Add(type, instance);
}
return instance;
}
}
public void TryAddService(Type type, object instance)
{
lock (services) {
if (!services.ContainsKey(type))
services.Add(type, instance);
}
}
public object GetService(Type type)
{
lock (services) {
object instance;
if (services.TryGetValue(type, out instance))
return instance;
else
return null;
}
}
public void Dispose()
{
IDisposable[] disposables;
lock (services) {
disposables = services.Values.OfType<IDisposable>().ToArray();
services.Clear();
}
foreach (IDisposable disposable in disposables)
disposable.Dispose();
}
}
}

3
src/Main/Base/Test/WebReferences/WebReferenceTests.cs

@ -2,7 +2,6 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
using SD = ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework; using NUnit.Framework;
using System; using System;
@ -13,6 +12,8 @@ using System.Web.Services.Discovery;
namespace ICSharpCode.SharpDevelop.Tests.WebReferences namespace ICSharpCode.SharpDevelop.Tests.WebReferences
{ {
using SD = ICSharpCode.SharpDevelop.Gui;
/// <summary> /// <summary>
/// Tests the generated project items for a web reference. /// Tests the generated project items for a web reference.
/// </summary> /// </summary>

6
src/Main/Core/Project/Src/Services/ServiceManager.cs

@ -47,7 +47,7 @@ namespace ICSharpCode.Core.Services
{ {
object service = GetService(serviceType); object service = GetService(serviceType);
if (service == null) if (service == null)
throw new ServiceNotFoundException(); throw new ServiceNotFoundException(serviceType != null ? serviceType.FullName : "null");
return service; return service;
} }
@ -76,8 +76,8 @@ namespace ICSharpCode.Core.Services
sealed class DefaultServiceManager : ServiceManager sealed class DefaultServiceManager : ServiceManager
{ {
static ILoggingService loggingService = new TextWriterLoggingService(new DebugTextWriter()); readonly ILoggingService loggingService = new TextWriterLoggingService(new DebugTextWriter());
static IMessageService messageService = new TextWriterMessageService(Console.Out); readonly IMessageService messageService = new TextWriterMessageService(Console.Out);
public override ILoggingService LoggingService { public override ILoggingService LoggingService {
get { return loggingService; } get { return loggingService; }

Loading…
Cancel
Save