Skip to content

Commit a24e0f9

Browse files
committed
Refactoring:
- Decouple services to reduce circular dependencies - Move update panel to a separate control - Remove unrelated methods from MainWindow
1 parent 79d83af commit a24e0f9

37 files changed

+525
-448
lines changed

ICSharpCode.ILSpyX/Analyzers/AnalyzerScope.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,14 @@ public class AnalyzerScope
4040
/// </summary>
4141
public bool IsLocal { get; }
4242

43-
public AssemblyList AssemblyList { get; }
44-
4543
public ISymbol AnalyzedSymbol { get; }
4644

4745
public ITypeDefinition TypeScope => typeScope;
4846

49-
Accessibility effectiveAccessibility;
47+
readonly Accessibility effectiveAccessibility;
5048

5149
public AnalyzerScope(AssemblyList assemblyList, IEntity entity)
5250
{
53-
AssemblyList = assemblyList;
5451
assemblyListSnapshot = assemblyList.GetSnapshot();
5552
AnalyzedSymbol = entity;
5653
DetermineEffectiveAccessibility(entity, out typeScope, out effectiveAccessibility);

ICSharpCode.ILSpyX/Analyzers/IAnalyzer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public interface IAnalyzer
4242
public interface IAnalyzerMetadata
4343
{
4444
string Header { get; }
45+
4546
int Order { get; }
4647
}
4748
}

ILSpy/AboutPage.cs

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,36 +26,42 @@
2626
using System.Windows.Controls.Primitives;
2727
using System.Windows.Data;
2828
using System.Windows.Input;
29-
using System.Windows.Navigation;
3029

3130
using ICSharpCode.AvalonEdit.Rendering;
3231
using ICSharpCode.Decompiler;
33-
using ICSharpCode.ILSpy.AssemblyTree;
3432
using ICSharpCode.ILSpy.Properties;
3533
using ICSharpCode.ILSpy.TextView;
3634
using ICSharpCode.ILSpy.Themes;
3735
using ICSharpCode.ILSpy.Updates;
36+
using ICSharpCode.ILSpy.ViewModels;
3837

3938
namespace ICSharpCode.ILSpy
4039
{
4140
[ExportMainMenuCommand(ParentMenuID = nameof(Resources._Help), Header = nameof(Resources._About), MenuOrder = 99999)]
4241
[Shared]
43-
public sealed class AboutPageCommand(AssemblyTreeModel assemblyTreeModel) : SimpleCommand
42+
public sealed class AboutPage : SimpleCommand
4443
{
44+
readonly SettingsService settingsService;
45+
readonly IEnumerable<IAboutPageAddition> aboutPageAdditions;
46+
47+
public AboutPage(SettingsService settingsService, IEnumerable<IAboutPageAddition> aboutPageAdditions)
48+
{
49+
this.settingsService = settingsService;
50+
this.aboutPageAdditions = aboutPageAdditions;
51+
MessageBus<ShowAboutPageEventArgs>.Subscribers += (_, e) => ShowAboutPage(e.TabPage);
52+
}
53+
4554
public override void Execute(object parameter)
4655
{
47-
assemblyTreeModel.NavigateTo(
48-
new RequestNavigateEventArgs(new Uri("resource://aboutpage"), null),
49-
inNewTabPage: true
50-
);
56+
MessageBus.Send(this, new NavigateToEventArgs(new(new("resource://aboutpage"), null), inNewTabPage: true));
5157
}
52-
}
5358

54-
[Export]
55-
[Shared]
56-
public sealed class AboutPage(IEnumerable<IAboutPageAddition> aboutPageAdditions, SettingsService settingsService)
57-
{
58-
public void Display(DecompilerTextView textView)
59+
private void ShowAboutPage(TabPageModel tabPage)
60+
{
61+
tabPage.ShowTextView(Display);
62+
}
63+
64+
private void Display(DecompilerTextView textView)
5965
{
6066
AvalonEditTextOutput output = new AvalonEditTextOutput() {
6167
Title = Resources.About,
@@ -72,14 +78,14 @@ public void Display(DecompilerTextView textView)
7278
HorizontalAlignment = HorizontalAlignment.Center,
7379
Orientation = Orientation.Horizontal
7480
};
75-
if (NotifyOfUpdatesStrategy.LatestAvailableVersion == null)
81+
if (UpdateService.LatestAvailableVersion == null)
7682
{
7783
AddUpdateCheckButton(stackPanel, textView);
7884
}
7985
else
8086
{
8187
// we already retrieved the latest version sometime earlier
82-
ShowAvailableVersion(NotifyOfUpdatesStrategy.LatestAvailableVersion, stackPanel);
88+
ShowAvailableVersion(UpdateService.LatestAvailableVersion, stackPanel);
8389
}
8490
CheckBox checkBox = new() {
8591
Margin = new Thickness(4),
@@ -104,8 +110,7 @@ public void Display(DecompilerTextView textView)
104110
{
105111
using (StreamReader r = new StreamReader(s))
106112
{
107-
string line;
108-
while ((line = r.ReadLine()) != null)
113+
while (r.ReadLine() is { } line)
109114
{
110115
output.WriteLine(line);
111116
}
@@ -166,7 +171,7 @@ static void AddUpdateCheckButton(StackPanel stackPanel, DecompilerTextView textV
166171

167172
try
168173
{
169-
AvailableVersionInfo vInfo = await NotifyOfUpdatesStrategy.GetLatestVersionAsync();
174+
AvailableVersionInfo vInfo = await UpdateService.GetLatestVersionAsync();
170175
stackPanel.Children.Clear();
171176
ShowAvailableVersion(vInfo, stackPanel);
172177
}
@@ -209,7 +214,7 @@ static void ShowAvailableVersion(AvailableVersionInfo availableVersion, StackPan
209214
button.Content = Resources.Download;
210215
button.Cursor = Cursors.Arrow;
211216
button.Click += delegate {
212-
MainWindow.OpenLink(availableVersion.DownloadUrl);
217+
GlobalUtils.OpenLink(availableVersion.DownloadUrl);
213218
};
214219
stackPanel.Children.Add(button);
215220
}

ILSpy/Analyzers/AnalyzeCommand.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ public void Execute(TextViewContext context)
7373
}
7474
}
7575

76+
[Export]
77+
[Shared]
7678
public sealed class AnalyzeCommand(AssemblyTreeModel assemblyTreeModel, AnalyzerTreeViewModel analyzerTreeViewModel) : SimpleCommand
7779
{
7880
public override bool CanExecute(object parameter)

ILSpy/Analyzers/AnalyzerSearchTreeNode.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,10 @@ protected IEnumerable<AnalyzerTreeNode> FetchChildren(CancellationToken ct)
5858
{
5959
if (symbol is IEntity)
6060
{
61-
var context = new AnalyzerContext() {
61+
var context = new AnalyzerContext {
6262
CancellationToken = ct,
6363
Language = Language,
64-
AssemblyList = AssemblyTreeModel.AssemblyList
64+
AssemblyList = AssemblyList
6565
};
6666
var results = analyzer.Analyze(symbol, context).Select(SymbolTreeNodeFactory);
6767
if (context.SortResults)

ILSpy/Analyzers/AnalyzerTreeNode.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ namespace ICSharpCode.ILSpy.Analyzers
3030
{
3131
public abstract class AnalyzerTreeNode : SharpTreeNode
3232
{
33-
public static Language Language => App.ExportProvider.GetExportedValue<LanguageService>().Language;
33+
protected static Language Language => App.ExportProvider.GetExportedValue<LanguageService>().Language;
34+
35+
protected static AssemblyList AssemblyList => App.ExportProvider.GetExportedValue<AssemblyList>();
3436

3537
public override bool CanDelete()
3638
{
@@ -47,8 +49,6 @@ public override void Delete()
4749
DeleteCore();
4850
}
4951

50-
public static AssemblyTreeModel AssemblyTreeModel { get; } = App.ExportProvider.GetExportedValue<AssemblyTreeModel>();
51-
5252
public static ICollection<IExport<IAnalyzer, IAnalyzerMetadata>> Analyzers => App.ExportProvider
5353
.GetExports<IAnalyzer, IAnalyzerMetadata>("Analyzer")
5454
.OrderBy(item => item.Metadata?.Order)

ILSpy/App.xaml.cs

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525
using System.Runtime.Loader;
2626
using System.Threading.Tasks;
2727
using System.Windows;
28-
using System.Windows.Documents;
29-
using System.Windows.Navigation;
3028
using System.Windows.Threading;
3129

3230
using ICSharpCode.ILSpy.AppEnv;
@@ -115,9 +113,6 @@ public App()
115113
Thread.CurrentThread.CurrentUICulture = CultureInfo.DefaultThreadCurrentUICulture = new(sessionSettings.CurrentCulture);
116114
}
117115

118-
EventManager.RegisterClassHandler(typeof(Window),
119-
Hyperlink.RequestNavigateEvent,
120-
new RequestNavigateEventHandler(Window_RequestNavigate));
121116
ILSpyTraceListener.Install();
122117

123118
if (CommandLineArguments.ArgumentsParser.IsShowingInformation)
@@ -138,7 +133,7 @@ public App()
138133

139134
public new MainWindow MainWindow {
140135
get => (MainWindow)base.MainWindow;
141-
set => base.MainWindow = value;
136+
private set => base.MainWindow = value;
142137
}
143138

144139
private static void SingleInstance_NewInstanceDetected(object sender, NewInstanceEventArgs e) => ExportProvider.GetExportedValue<AssemblyTreeModel>().HandleSingleInstanceCommandLineArguments(e.Args).HandleExceptions();
@@ -152,7 +147,7 @@ static Assembly ResolvePluginDependencies(AssemblyLoadContext context, AssemblyN
152147
return context.LoadFromAssemblyPath(assemblyFileName);
153148
}
154149

155-
private static bool InitializeDependencyInjection(SettingsService settingsService)
150+
private bool InitializeDependencyInjection(SettingsService settingsService)
156151
{
157152
// Add custom logic for resolution of dependencies.
158153
// This necessary because the AssemblyLoadContext.LoadFromAssemblyPath and related methods,
@@ -193,11 +188,14 @@ private static bool InitializeDependencyInjection(SettingsService settingsServic
193188
services.AddSingleton(_ => ExportProvider);
194189
// Add the docking manager
195190
services.AddSingleton(serviceProvider => serviceProvider.GetService<MainWindow>().DockManager);
191+
services.AddTransient(serviceProvider => serviceProvider.GetService<AssemblyTreeModel>().AssemblyList);
196192

197193
var serviceProvider = services.BuildServiceProvider(new ServiceProviderOptions { ValidateOnBuild = true });
198194

199195
ExportProvider = new ExportProviderAdapter(serviceProvider);
200196

197+
Exit += (_, _) => serviceProvider.Dispose();
198+
201199
return true;
202200
}
203201
catch (Exception ex)
@@ -274,10 +272,5 @@ internal static void UnhandledException(Exception exception)
274272
}
275273
}
276274
#endregion
277-
278-
void Window_RequestNavigate(object sender, RequestNavigateEventArgs e)
279-
{
280-
ExportProvider.GetExportedValue<AssemblyTreeModel>().NavigateTo(e);
281-
}
282275
}
283276
}

0 commit comments

Comments
 (0)