Browse Source

Allow service registration using the AddInTree.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
c559da3336
  1. 6
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin
  2. 2
      src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchResultNode.cs
  3. 2
      src/Main/Base/Project/Src/Editor/AvalonEdit/AvalonEditTextEditorAdapter.cs
  4. 104
      src/Main/Base/Project/Src/Editor/IEditorControlService.cs
  5. 4
      src/Main/Base/Project/Src/Gui/Dialogs/NewFileDialog.cs
  6. 2
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.cs
  7. 2
      src/Main/Base/Project/Src/Gui/Pads/AbstractConsolePad.cs
  8. 4
      src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs
  9. 4
      src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs
  10. 2
      src/Main/Base/Project/Src/Project/AbstractProject.cs
  11. 9
      src/Main/Base/Project/Src/Services/SD.cs
  12. 8
      src/Main/Base/Project/Src/Util/ExtensionMethods.cs
  13. 28
      src/Main/Base/Project/Src/Util/ThreadSafeServiceContainer.cs
  14. 3
      src/Main/Core/Project/ICSharpCode.Core.csproj
  15. 6
      src/Main/Core/Project/Src/AddInTree/CoreStartup.cs
  16. 62
      src/Main/Core/Project/Src/Services/FallbackServiceAttribute.cs
  17. 7
      src/Main/Core/Project/Src/Services/LoggingService/ILoggingService.cs
  18. 7
      src/Main/Core/Project/Src/Services/MessageService/IMessageService.cs
  19. 19
      src/Main/Core/Project/Src/Services/ServiceSingleton.cs
  20. 2
      src/Main/SharpDevelop/Sda/CallHelper.cs

6
src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin

@ -9,6 +9,7 @@ @@ -9,6 +9,7 @@
<Runtime>
<Import assembly = ":ICSharpCode.AvalonEdit"/>
<Import assembly = ":ICSharpCode.SharpDevelop"/>
<Import assembly = "ICSharpCode.AvalonEdit.AddIn.dll">
<Doozer name="SyntaxMode" class="ICSharpCode.AvalonEdit.AddIn.SyntaxModeDoozer"/>
<Doozer name="ContextActionOptionPanel" class="ICSharpCode.AvalonEdit.AddIn.ContextActions.ContextActionOptionPanelDoozer"/>
@ -29,8 +30,9 @@ @@ -29,8 +30,9 @@
<Include id="DefaultEditor" path="/SharpDevelop/ViewContent/TextEditor/ContextMenu"/>
</Path>
<Path name = "/SharpDevelop/ViewContent/TextEditor/EditorControlService">
<Class id="CodeEditorView" class="ICSharpCode.AvalonEdit.AddIn.AvalonEditorControlService"/>
<Path name = "/SharpDevelop/Services">
<Service id="ICSharpCode.SharpDevelop.Editor.IEditorControlService"
class="ICSharpCode.AvalonEdit.AddIn.AvalonEditorControlService"/>
</Path>
<!--

2
src/AddIns/Misc/SearchAndReplace/Project/Gui/SearchResultNode.cs

@ -56,7 +56,7 @@ namespace SearchAndReplace @@ -56,7 +56,7 @@ namespace SearchAndReplace
LoggingService.Debug("Creating text for search result (" + location.Line + ", " + location.Column + ") ");
TextBlock textBlock = new TextBlock();
textBlock.FontFamily = new FontFamily(EditorControlService.GlobalOptions.FontFamily);
textBlock.FontFamily = new FontFamily(SD.EditorControlService.GlobalOptions.FontFamily);
textBlock.Inlines.Add("(" + location.Line + ", " + location.Column + ")\t");

2
src/Main/Base/Project/Src/Editor/AvalonEdit/AvalonEditTextEditorAdapter.cs

@ -41,7 +41,7 @@ namespace ICSharpCode.SharpDevelop.Editor.AvalonEdit @@ -41,7 +41,7 @@ namespace ICSharpCode.SharpDevelop.Editor.AvalonEdit
public static TextEditor CreateAvalonEditInstance()
{
object editor;
EditorControlService.CreateEditor(out editor);
SD.EditorControlService.CreateEditor(out editor);
if (!(editor is TextEditor))
throw new NotSupportedException("Expected text editor to be AvalonEdit");
return (TextEditor)editor;

104
src/Main/Base/Project/Src/Editor/IEditorControlService.cs

@ -3,6 +3,8 @@ @@ -3,6 +3,8 @@
using System;
using ICSharpCode.AvalonEdit;
using ICSharpCode.Core;
using ICSharpCode.Core.Services;
using ICSharpCode.SharpDevelop.Editor.AvalonEdit;
namespace ICSharpCode.SharpDevelop.Editor
@ -10,86 +12,56 @@ namespace ICSharpCode.SharpDevelop.Editor @@ -10,86 +12,56 @@ namespace ICSharpCode.SharpDevelop.Editor
/// <summary>
/// Allows creating new text editor instances and accessing the default text editor options.
/// </summary>
[FallbackService(typeof(EditorControlServiceFallback))]
public interface IEditorControlService
{
ITextEditor CreateEditor(out object control);
ITextEditorOptions GlobalOptions { get; }
}
/// <summary>
/// Allows creating new text editor instances and accessing the default text editor options.
/// </summary>
public static class EditorControlService
// Fallback if AvalonEdit.AddIn is not available (e.g. some unit tests)
sealed class EditorControlServiceFallback : IEditorControlService, ITextEditorOptions
{
static readonly Lazy<IEditorControlService> instance = new Lazy<IEditorControlService>(
delegate {
// fetch IEditorControlService that's normally implemented in AvalonEdit.AddIn
var node = Core.AddInTree.GetTreeNode("/SharpDevelop/ViewContent/TextEditor/EditorControlService", false);
IEditorControlService ecs = null;
if (node != null && node.Codons.Count > 0) {
ecs = (IEditorControlService)node.BuildChildItem(node.Codons[0], null);
}
return ecs ?? new DummyService();
}
);
public static IEditorControlService Instance {
get { return instance.Value; }
public ITextEditorOptions GlobalOptions {
get { return this; }
}
public static ITextEditor CreateEditor(out object control)
public ITextEditor CreateEditor(out object control)
{
return Instance.CreateEditor(out control);
TextEditor avalonedit = new TextEditor();
control = avalonedit;
return new AvalonEditTextEditorAdapter(avalonedit);
}
public static ITextEditorOptions GlobalOptions {
get { return Instance.GlobalOptions; }
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged { add {} remove {} }
public string IndentationString {
get { return "\t"; }
}
// Fallback if AvalonEdit.AddIn is not available (e.g. some unit tests)
sealed class DummyService : IEditorControlService, ITextEditorOptions
{
public ITextEditorOptions GlobalOptions {
get { return this; }
}
public ITextEditor CreateEditor(out object control)
{
TextEditor avalonedit = new TextEditor();
control = avalonedit;
return new AvalonEditTextEditorAdapter(avalonedit);
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged { add {} remove {} }
public string IndentationString {
get { return "\t"; }
}
public bool AutoInsertBlockEnd {
get { return true; }
}
public bool ConvertTabsToSpaces {
get { return false; }
}
public int IndentationSize {
get { return 4; }
}
public int VerticalRulerColumn {
get { return 120; }
}
public bool UnderlineErrors {
get { return true; }
}
public string FontFamily {
get {
return "Consolas";
}
public bool AutoInsertBlockEnd {
get { return true; }
}
public bool ConvertTabsToSpaces {
get { return false; }
}
public int IndentationSize {
get { return 4; }
}
public int VerticalRulerColumn {
get { return 120; }
}
public bool UnderlineErrors {
get { return true; }
}
public string FontFamily {
get {
return "Consolas";
}
}
}

4
src/Main/Base/Project/Src/Gui/Dialogs/NewFileDialog.cs

@ -374,8 +374,8 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -374,8 +374,8 @@ namespace ICSharpCode.SharpDevelop.Gui
string parsedContent = StringParser.Parse(StringParser.Parse(content));
if (parsedContent != null) {
if (EditorControlService.GlobalOptions.IndentationString != "\t") {
parsedContent = parsedContent.Replace("\t", EditorControlService.GlobalOptions.IndentationString);
if (SD.EditorControlService.GlobalOptions.IndentationString != "\t") {
parsedContent = parsedContent.Replace("\t", SD.EditorControlService.GlobalOptions.IndentationString);
}
}

2
src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.cs

@ -131,7 +131,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -131,7 +131,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
defaultManifest = r.ReadToEnd();
}
}
defaultManifest = defaultManifest.Replace("\t", EditorControlService.GlobalOptions.IndentationString);
defaultManifest = defaultManifest.Replace("\t", SD.EditorControlService.GlobalOptions.IndentationString);
File.WriteAllText(manifestFile, defaultManifest, System.Text.Encoding.UTF8);
FileService.FireFileCreated(manifestFile, false);
}

2
src/Main/Base/Project/Src/Gui/Pads/AbstractConsolePad.cs

@ -278,7 +278,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -278,7 +278,7 @@ namespace ICSharpCode.SharpDevelop.Gui
object tmp;
this.editorAdapter = EditorControlService.CreateEditor(out tmp);
this.editorAdapter = SD.EditorControlService.CreateEditor(out tmp);
this.editor = (AvalonEdit.TextEditor)tmp;
this.editor.SetValue(Grid.ColumnProperty, 0);

4
src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs

@ -86,9 +86,9 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -86,9 +86,9 @@ namespace ICSharpCode.SharpDevelop.Gui
Task<ResolveResult> ResolveAtCaretAsync(ParserUpdateStepEventArgs e)
{
IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow;
if (window == null) return null;
if (window == null) return Task.FromResult<ResolveResult>(null);
ITextEditorProvider provider = window.ActiveViewContent as ITextEditorProvider;
if (provider == null) return null;
if (provider == null) return Task.FromResult<ResolveResult>(null);
ITextEditor editor = provider.TextEditor;
// e might be null when this is a manually triggered update

4
src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs

@ -375,8 +375,8 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -375,8 +375,8 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
StreamWriter sr = new StreamWriter(File.Create(fileName), ParserService.DefaultFileEncoding);
string fileContent = StringParser.Parse(file.Content, new StringTagPair("ProjectName", projectCreateInformation.ProjectName), new StringTagPair("FileName", fileName));
fileContent = StringParser.Parse(fileContent);
if (EditorControlService.GlobalOptions.IndentationString != "\t") {
fileContent = fileContent.Replace("\t", EditorControlService.GlobalOptions.IndentationString);
if (SD.EditorControlService.GlobalOptions.IndentationString != "\t") {
fileContent = fileContent.Replace("\t", SD.EditorControlService.GlobalOptions.IndentationString);
}
sr.Write(fileContent);
sr.Close();

2
src/Main/Base/Project/Src/Project/AbstractProject.cs

@ -596,7 +596,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -596,7 +596,7 @@ namespace ICSharpCode.SharpDevelop.Project
options.BlankLinesBetweenMembers = AmbienceService.CodeGenerationProperties.Get("BlankLinesBetweenMembers", true);
options.BracingStyle = AmbienceService.CodeGenerationProperties.Get("StartBlockOnSameLine", true) ? "Block" : "C";
options.ElseOnClosing = AmbienceService.CodeGenerationProperties.Get("ElseOnClosing", true);
options.IndentString = ICSharpCode.SharpDevelop.Editor.EditorControlService.GlobalOptions.IndentationString;
options.IndentString = SD.EditorControlService.GlobalOptions.IndentationString;
provider.GenerateCodeFromCompileUnit(compileUnit, writer, options);
} else {
writer.WriteLine("No CodeDom provider was found for this language.");

9
src/Main/Base/Project/Src/Services/SD.cs

@ -6,6 +6,7 @@ using System.ComponentModel.Design; @@ -6,6 +6,7 @@ using System.ComponentModel.Design;
using ICSharpCode.Core;
using ICSharpCode.Core.Implementation;
using ICSharpCode.Core.Services;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.SharpDevelop
@ -32,9 +33,7 @@ namespace ICSharpCode.SharpDevelop @@ -32,9 +33,7 @@ namespace ICSharpCode.SharpDevelop
/// </summary>
public static void InitializeForUnitTests()
{
var container = new ThreadSafeServiceContainer();
container.AddService(typeof(ILoggingService), new TextWriterLoggingService(new TraceTextWriter()));
container.AddService(typeof(IMessageService), new TextWriterMessageService(Console.Out));
var container = new ThreadSafeServiceContainer(ServiceSingleton.FallbackServiceProvider);
PropertyService.InitializeServiceForUnitTests();
ServiceSingleton.ServiceProvider = container;
}
@ -76,5 +75,9 @@ namespace ICSharpCode.SharpDevelop @@ -76,5 +75,9 @@ namespace ICSharpCode.SharpDevelop
public static IMessageService MessageService {
get { return GetRequiredService<IMessageService>(); }
}
public static IEditorControlService EditorControlService {
get { return GetRequiredService<IEditorControlService>(); }
}
}
}

8
src/Main/Base/Project/Src/Util/ExtensionMethods.cs

@ -519,9 +519,9 @@ namespace ICSharpCode.SharpDevelop @@ -519,9 +519,9 @@ namespace ICSharpCode.SharpDevelop
{
StringWriter sw = new StringWriter();
using (XmlTextWriter xmlW = new XmlTextWriter(sw)) {
if (EditorControlService.GlobalOptions.ConvertTabsToSpaces) {
if (SD.EditorControlService.GlobalOptions.ConvertTabsToSpaces) {
xmlW.IndentChar = ' ';
xmlW.Indentation = EditorControlService.GlobalOptions.IndentationSize;
xmlW.Indentation = SD.EditorControlService.GlobalOptions.IndentationSize;
} else {
xmlW.Indentation = 1;
xmlW.IndentChar = '\t';
@ -538,7 +538,7 @@ namespace ICSharpCode.SharpDevelop @@ -538,7 +538,7 @@ namespace ICSharpCode.SharpDevelop
{
StringBuilder indentation = new StringBuilder();
for (int i = 0; i < level; i++) {
indentation.Append(EditorControlService.GlobalOptions.IndentationString);
indentation.Append(SD.EditorControlService.GlobalOptions.IndentationString);
}
return indentation.ToString();
}
@ -573,7 +573,7 @@ namespace ICSharpCode.SharpDevelop @@ -573,7 +573,7 @@ namespace ICSharpCode.SharpDevelop
while (tmp != null) {
tmp = tmp.Parent;
indentationLevel++;
indentation.Append(EditorControlService.GlobalOptions.IndentationString);
indentation.Append(SD.EditorControlService.GlobalOptions.IndentationString);
}
if (!element.Nodes().Any()) {
element.Add(new XText(Environment.NewLine + GetIndentation(indentationLevel - 1)));

28
src/Main/Base/Project/Src/Util/ThreadSafeServiceContainer.cs

@ -13,7 +13,8 @@ namespace ICSharpCode.SharpDevelop @@ -13,7 +13,8 @@ namespace ICSharpCode.SharpDevelop
/// </summary>
public class ThreadSafeServiceContainer : IServiceProvider, IServiceContainer, IDisposable
{
Dictionary<Type, object> services = new Dictionary<Type, object>();
readonly IServiceProvider parentProvider;
readonly Dictionary<Type, object> services = new Dictionary<Type, object>();
public ThreadSafeServiceContainer()
{
@ -21,33 +22,20 @@ namespace ICSharpCode.SharpDevelop @@ -21,33 +22,20 @@ namespace ICSharpCode.SharpDevelop
services.Add(typeof(IServiceContainer), this);
}
public object GetOrCreateService(Type type, Func<object> serviceCreator)
public ThreadSafeServiceContainer(IServiceProvider parentProvider) : this()
{
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);
}
this.parentProvider = parentProvider;
}
public object GetService(Type serviceType)
{
bool foundService;
object instance;
lock (services) {
if (!services.TryGetValue(serviceType, out instance))
return null;
foundService = services.TryGetValue(serviceType, out instance);
}
if (!foundService)
return parentProvider != null ? parentProvider.GetService(serviceType) : null;
ServiceCreatorCallback callback = instance as ServiceCreatorCallback;
if (callback == null)
return instance;

3
src/Main/Core/Project/ICSharpCode.Core.csproj

@ -107,6 +107,7 @@ @@ -107,6 +107,7 @@
<Compile Include="Src\Services\AnalyticsMonitor\AnalyticsMonitorService.cs" />
<Compile Include="Src\Services\AnalyticsMonitor\IAnalyticsMonitor.cs" />
<Compile Include="Src\Services\ApplicationStateInfoService.cs" />
<Compile Include="Src\Services\FallbackServiceAttribute.cs" />
<Compile Include="Src\Services\FileUtility\FileName.cs" />
<Compile Include="Src\Services\FileUtility\FileNameEventHandler.cs" />
<Compile Include="Src\Services\FileUtility\FileUtility.cs" />
@ -121,7 +122,7 @@ @@ -121,7 +122,7 @@
<Compile Include="Src\Services\RegistryService\RegistryService.cs" />
<Compile Include="Src\Services\ResourceService\ResourceNotFoundException.cs" />
<Compile Include="Src\Services\ResourceService\ResourceService.cs" />
<Compile Include="Src\Services\ServiceManager.cs" />
<Compile Include="Src\Services\ServiceSingleton.cs" />
<Compile Include="Src\Services\ServiceNotFoundException.cs" />
<Compile Include="Src\Services\StringParser\IStringTagProvider.cs" />
<Compile Include="Src\Services\StringParser\PropertyObjectTagProvider.cs" />

6
src/Main/Core/Project/Src/AddInTree/CoreStartup.cs

@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.Design;
using System.IO;
namespace ICSharpCode.Core
@ -176,6 +177,11 @@ namespace ICSharpCode.Core @@ -176,6 +177,11 @@ namespace ICSharpCode.Core
{
AddInTree.Load(addInFiles, disabledAddIns);
// perform service registration
var container = ServiceSingleton.ServiceProvider.GetService<IServiceContainer>();
if (container != null)
AddInTree.BuildItems<object>("/SharpDevelop/Services", container, false);
// run workspace autostart commands
LoggingService.Info("Running autostart commands...");
foreach (ICommand command in AddInTree.BuildItems<ICommand>("/Workspace/Autostart", null, false)) {

62
src/Main/Core/Project/Src/Services/FallbackServiceAttribute.cs

@ -0,0 +1,62 @@ @@ -0,0 +1,62 @@
// 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.Collections.Generic;
namespace ICSharpCode.Core
{
/// <summary>
/// Used on a service interface to indicate the default implementation.
/// </summary>
[AttributeUsage(AttributeTargets.Interface, Inherited=false)]
public class FallbackServiceAttribute : Attribute
{
readonly string assemblyQualifiedName;
readonly Type fallbackServiceType;
public FallbackServiceAttribute(Type fallbackServiceType)
{
if (fallbackServiceType == null)
throw new ArgumentNullException("fallbackServiceType");
this.fallbackServiceType = fallbackServiceType;
}
public FallbackServiceAttribute(string assemblyQualifiedName)
{
if (assemblyQualifiedName == null)
throw new ArgumentNullException("assemblyQualifiedName");
this.assemblyQualifiedName = assemblyQualifiedName;
}
public string AssemblyQualifiedName {
get { return assemblyQualifiedName ?? fallbackServiceType.AssemblyQualifiedName; }
}
public Type FallbackServiceType {
get { return fallbackServiceType ?? Type.GetType(assemblyQualifiedName); }
}
}
sealed class FallbackServiceProvider : IServiceProvider
{
Dictionary<Type, object> fallbackServiceDict = new Dictionary<Type, object>();
public object GetService(Type serviceType)
{
object instance;
lock (fallbackServiceDict) {
if (!fallbackServiceDict.TryGetValue(serviceType, out instance)) {
var attr = serviceType.GetCustomAttributes(typeof(FallbackServiceAttribute), false);
if (attr.Length == 1) {
instance = Activator.CreateInstance(((FallbackServiceAttribute)attr[0]).FallbackServiceType);
} else {
instance = null;
}
fallbackServiceDict.Add(serviceType, instance);
}
}
return instance;
}
}
}

7
src/Main/Core/Project/Src/Services/LoggingService/ILoggingService.cs

@ -2,9 +2,11 @@ @@ -2,9 +2,11 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.Core.Implementation;
namespace ICSharpCode.Core
{
[FallbackService(typeof(FallbackLoggingService))]
public interface ILoggingService
{
void Debug(object message);
@ -26,4 +28,9 @@ namespace ICSharpCode.Core @@ -26,4 +28,9 @@ namespace ICSharpCode.Core
bool IsErrorEnabled { get; }
bool IsFatalEnabled { get; }
}
sealed class FallbackLoggingService : TextWriterLoggingService
{
public FallbackLoggingService() : base(new TraceTextWriter()) {}
}
}

7
src/Main/Core/Project/Src/Services/MessageService/IMessageService.cs

@ -2,12 +2,14 @@ @@ -2,12 +2,14 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.Core.Implementation;
namespace ICSharpCode.Core
{
/// <summary>
/// Interface for the MessageService.
/// </summary>
[FallbackService(typeof(FallbackMessageService))]
public interface IMessageService
{
/// <summary>
@ -62,6 +64,11 @@ namespace ICSharpCode.Core @@ -62,6 +64,11 @@ namespace ICSharpCode.Core
ChooseSaveErrorResult ChooseSaveError(string fileName, string message, string dialogName, Exception exceptionGot, bool chooseLocationEnabled);
}
sealed class FallbackMessageService : TextWriterMessageService
{
public FallbackMessageService() : base(Console.Out) {}
}
public sealed class ChooseSaveErrorResult
{
public bool IsRetry { get; private set; }

19
src/Main/Core/Project/Src/Services/ServiceManager.cs → src/Main/Core/Project/Src/Services/ServiceSingleton.cs

@ -6,6 +6,7 @@ using System.Collections.Generic; @@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.Design;
using ICSharpCode.Core.Implementation;
using ICSharpCode.Core.Services;
namespace ICSharpCode.Core
{
@ -14,7 +15,15 @@ namespace ICSharpCode.Core @@ -14,7 +15,15 @@ namespace ICSharpCode.Core
/// </summary>
public static class ServiceSingleton
{
volatile static IServiceProvider instance = CreateDefaultServiceContainer();
static readonly IServiceProvider fallbackServiceProvider = new FallbackServiceProvider();
volatile static IServiceProvider instance = new ServiceContainer(fallbackServiceProvider);
/// <summary>
/// Gets the service provider that provides the fallback services.
/// </summary>
public static IServiceProvider FallbackServiceProvider {
get { return fallbackServiceProvider; }
}
/// <summary>
/// Gets the static ServiceManager instance.
@ -28,14 +37,6 @@ namespace ICSharpCode.Core @@ -28,14 +37,6 @@ namespace ICSharpCode.Core
}
}
static IServiceProvider CreateDefaultServiceContainer()
{
ServiceContainer container = new ServiceContainer();
container.AddService(typeof(ILoggingService), new TextWriterLoggingService(new TraceTextWriter()));
container.AddService(typeof(IMessageService), new TextWriterMessageService(Console.Out));
return container;
}
public static T GetService<T>(this IServiceProvider provider) where T : class
{
return (T)provider.GetService(typeof(T));

2
src/Main/SharpDevelop/Sda/CallHelper.cs

@ -38,7 +38,7 @@ namespace ICSharpCode.SharpDevelop.Sda @@ -38,7 +38,7 @@ namespace ICSharpCode.SharpDevelop.Sda
public void InitSharpDevelopCore(SharpDevelopHost.CallbackHelper callback, StartupSettings properties)
{
// Initialize the most important services:
var container = new ThreadSafeServiceContainer();
var container = new ThreadSafeServiceContainer(ServiceSingleton.FallbackServiceProvider);
container.AddService(typeof(IMessageService), new SDMessageService());
container.AddService(typeof(ILoggingService), new log4netLoggingService());
ServiceSingleton.ServiceProvider = container;

Loading…
Cancel
Save