Skip to content

Commit bb9e7cc

Browse files
authored
Merge pull request #2151 from Hosch250/ninjectMemoryLeaks
Ninject memory leaks
2 parents 9340a52 + f81dd86 commit bb9e7cc

31 files changed

+149
-173
lines changed

RetailCoder.VBE/App.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ public void Dispose()
205205
{
206206
_parser.State.StateChanged -= Parser_StateChanged;
207207
_parser.State.StatusMessageUpdate -= State_StatusMessageUpdate;
208+
_parser.State.Dispose();
208209
_parser.Dispose();
209210
// I won't set this to null because other components may try to release things
210211
}

RetailCoder.VBE/Inspections/IInspector.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace Rubberduck.Inspections
88
{
9-
public interface IInspector
9+
public interface IInspector : IDisposable
1010
{
1111
Task<IEnumerable<ICodeInspectionResult>> FindIssuesAsync(RubberduckParserState state, CancellationToken token);
1212
}

RetailCoder.VBE/Inspections/Inspector.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ namespace Rubberduck.Inspections
1515
{
1616
namespace Rubberduck.Inspections
1717
{
18-
public class Inspector : IInspector, IDisposable
18+
public class Inspector : IInspector
1919
{
2020
private readonly IGeneralConfigService _configService;
21-
private readonly IEnumerable<IInspection> _inspections;
21+
private readonly List<IInspection> _inspections;
2222

2323
public Inspector(IGeneralConfigService configService, IEnumerable<IInspection> inspections)
2424
{
25-
_inspections = inspections;
25+
_inspections = inspections.ToList();
2626

2727
_configService = configService;
2828
configService.SettingsChanged += ConfigServiceSettingsChanged;
@@ -127,6 +127,8 @@ public void Dispose()
127127
{
128128
_configService.SettingsChanged -= ConfigServiceSettingsChanged;
129129
}
130+
131+
_inspections.Clear();
130132
}
131133
}
132134
}

RetailCoder.VBE/Root/RubberduckModule.cs

Lines changed: 39 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
using Ninject.Modules;
1010
using Rubberduck.Common;
1111
using Rubberduck.Inspections;
12-
using Rubberduck.Navigation.CodeExplorer;
1312
using Rubberduck.Parsing;
1413
using Rubberduck.Parsing.VBA;
1514
using Rubberduck.Settings;
@@ -31,6 +30,7 @@
3130
using Rubberduck.Parsing.Preprocessing;
3231
using System.Globalization;
3332
using Ninject.Extensions.Interception.Infrastructure.Language;
33+
using Ninject.Extensions.NamedScope;
3434
using Rubberduck.Parsing.Symbols;
3535
using Rubberduck.UI.CodeExplorer.Commands;
3636

@@ -76,8 +76,8 @@ public override void Load()
7676
Assembly.GetAssembly(typeof(IIndenter))
7777
};
7878

79-
ApplyConfigurationConvention(assemblies);
8079
ApplyDefaultInterfacesConvention(assemblies);
80+
ApplyConfigurationConvention(assemblies);
8181
ApplyAbstractFactoryConvention(assemblies);
8282

8383
BindCommandsToMenuItems();
@@ -96,53 +96,46 @@ public override void Load()
9696

9797
Bind<IPresenter>().To<TestExplorerDockablePresenter>()
9898
.WhenInjectedInto<TestExplorerCommand>()
99-
.InSingletonScope()
100-
.WithConstructorArgument<IDockableUserControl>(new TestExplorerWindow { ViewModel = Kernel.Get<TestExplorerViewModel>() });
99+
.InSingletonScope();
101100

102101
Bind<IPresenter>().To<CodeInspectionsDockablePresenter>()
103102
.WhenInjectedInto<InspectionResultsCommand>()
104-
.InSingletonScope()
105-
.WithConstructorArgument<IDockableUserControl>(new CodeInspectionsWindow { ViewModel = Kernel.Get<InspectionResultsViewModel>() });
103+
.InSingletonScope();
106104

107-
Bind<IControlView>().To<ChangesView>();
108-
Bind<IControlView>().To<BranchesView>();
109-
Bind<IControlView>().To<UnsyncedCommitsView>();
110-
Bind<IControlView>().To<SettingsView>();
105+
Bind<IControlView>().To<ChangesView>().InCallScope();
106+
Bind<IControlView>().To<BranchesView>().InCallScope();
107+
Bind<IControlView>().To<UnsyncedCommitsView>().InCallScope();
108+
Bind<IControlView>().To<SettingsView>().InCallScope();
111109

112110
Bind<IControlViewModel>().To<ChangesViewViewModel>()
113-
.WhenInjectedInto<ChangesView>();
111+
.WhenInjectedInto<ChangesView>().InCallScope();
114112
Bind<IControlViewModel>().To<BranchesViewViewModel>()
115-
.WhenInjectedInto<BranchesView>();
113+
.WhenInjectedInto<BranchesView>().InCallScope();
116114
Bind<IControlViewModel>().To<UnsyncedCommitsViewViewModel>()
117-
.WhenInjectedInto<UnsyncedCommitsView>();
115+
.WhenInjectedInto<UnsyncedCommitsView>().InCallScope();
118116
Bind<IControlViewModel>().To<SettingsViewViewModel>()
119-
.WhenInjectedInto<SettingsView>();
117+
.WhenInjectedInto<SettingsView>().InCallScope();
120118

121119
Bind<ISourceControlProviderFactory>().To<SourceControlProviderFactory>()
122120
.WhenInjectedInto<SourceControlViewViewModel>();
123121

124-
Bind<SourceControlDockablePresenter>().ToSelf()
125-
.InSingletonScope()
126-
.WithConstructorArgument(new SourceControlPanel { ViewModel = Kernel.Get<SourceControlViewViewModel>() });
122+
Bind<SourceControlDockablePresenter>().ToSelf().InSingletonScope();
127123

128124
BindCommandsToCodeExplorer();
129125
Bind<IPresenter>().To<CodeExplorerDockablePresenter>()
130126
.WhenInjectedInto<CodeExplorerCommand>()
131-
.InSingletonScope()
132-
.WithConstructorArgument<IDockableUserControl>(new CodeExplorerWindow { ViewModel = Kernel.Get<CodeExplorerViewModel>() });
127+
.InSingletonScope();
133128

134129
Bind<IPresenter>().To<ToDoExplorerDockablePresenter>()
135130
.WhenInjectedInto<ToDoExplorerCommand>()
136-
.InSingletonScope()
137-
.WithConstructorArgument<IDockableUserControl>(new ToDoExplorerWindow { ViewModel = Kernel.Get<ToDoExplorerViewModel>() });
131+
.InSingletonScope();
138132

139133
ConfigureRubberduckMenu();
140134
ConfigureCodePaneContextMenu();
141135
ConfigureFormDesignerContextMenu();
142136
ConfigureFormDesignerControlContextMenu();
143137
ConfigureProjectExplorerContextMenu();
144138

145-
146139
BindWindowsHooks();
147140
}
148141

@@ -164,7 +157,7 @@ private void ApplyDefaultInterfacesConvention(IEnumerable<Assembly> assemblies)
164157
// inspections & factories have their own binding rules
165158
.Where(type => !type.Name.EndsWith("Factory") && !type.Name.EndsWith("ConfigProvider") && !type.GetInterfaces().Contains(typeof(IInspection)))
166159
.BindDefaultInterface()
167-
.Configure(binding => binding.InThreadScope())); // TransientScope wouldn't dispose disposables
160+
.Configure(binding => binding.InCallScope())); // TransientScope wouldn't dispose disposables
168161
}
169162

170163
// note: settings namespace classes are injected in singleton scope
@@ -176,24 +169,24 @@ private void ApplyConfigurationConvention(IEnumerable<Assembly> assemblies)
176169
.BindAllInterfaces()
177170
.Configure(binding => binding.InSingletonScope()));
178171

179-
Bind<IPersistanceService<CodeInspectionSettings>>().To<XmlPersistanceService<CodeInspectionSettings>>().InSingletonScope();
180-
Bind<IPersistanceService<GeneralSettings>>().To<XmlPersistanceService<GeneralSettings>>().InSingletonScope();
181-
Bind<IPersistanceService<HotkeySettings>>().To<XmlPersistanceService<HotkeySettings>>().InSingletonScope();
182-
Bind<IPersistanceService<ToDoListSettings>>().To<XmlPersistanceService<ToDoListSettings>>().InSingletonScope();
183-
Bind<IPersistanceService<UnitTestSettings>>().To<XmlPersistanceService<UnitTestSettings>>().InSingletonScope();
184-
Bind<IPersistanceService<IndenterSettings>>().To<XmlPersistanceService<IndenterSettings>>().InSingletonScope();
185-
Bind<IFilePersistanceService<SourceControlSettings>>().To<XmlPersistanceService<SourceControlSettings>>().InSingletonScope();
186-
187-
Bind<IIndenterConfigProvider>().To<IndenterConfigProvider>().InSingletonScope();
188-
Bind<ISourceControlConfigProvider>().To<SourceControlConfigProvider>().InSingletonScope();
189-
190-
Bind<ICodeInspectionSettings>().To<CodeInspectionSettings>();
191-
Bind<IGeneralSettings>().To<GeneralSettings>();
192-
Bind<IHotkeySettings>().To<HotkeySettings>();
193-
Bind<IToDoListSettings>().To<ToDoListSettings>();
194-
Bind<IUnitTestSettings>().To<UnitTestSettings>();
195-
Bind<IIndenterSettings>().To<IndenterSettings>();
196-
Bind<ISourceControlSettings>().To<SourceControlSettings>();
172+
Bind<IPersistanceService<CodeInspectionSettings>>().To<XmlPersistanceService<CodeInspectionSettings>>().InCallScope();
173+
Bind<IPersistanceService<GeneralSettings>>().To<XmlPersistanceService<GeneralSettings>>().InCallScope();
174+
Bind<IPersistanceService<HotkeySettings>>().To<XmlPersistanceService<HotkeySettings>>().InCallScope();
175+
Bind<IPersistanceService<ToDoListSettings>>().To<XmlPersistanceService<ToDoListSettings>>().InCallScope();
176+
Bind<IPersistanceService<UnitTestSettings>>().To<XmlPersistanceService<UnitTestSettings>>().InCallScope();
177+
Bind<IPersistanceService<IndenterSettings>>().To<XmlPersistanceService<IndenterSettings>>().InCallScope();
178+
Bind<IFilePersistanceService<SourceControlSettings>>().To<XmlPersistanceService<SourceControlSettings>>().InCallScope();
179+
180+
Bind<IConfigProvider<IndenterSettings>>().To<IndenterConfigProvider>().InCallScope();
181+
Bind<IConfigProvider<SourceControlSettings>>().To<SourceControlConfigProvider>().InCallScope();
182+
183+
Bind<ICodeInspectionSettings>().To<CodeInspectionSettings>().InCallScope();
184+
Bind<IGeneralSettings>().To<GeneralSettings>().InCallScope();
185+
Bind<IHotkeySettings>().To<HotkeySettings>().InCallScope();
186+
Bind<IToDoListSettings>().To<ToDoListSettings>().InCallScope();
187+
Bind<IUnitTestSettings>().To<UnitTestSettings>().InCallScope();
188+
Bind<IIndenterSettings>().To<IndenterSettings>().InCallScope();
189+
Bind<ISourceControlSettings>().To<SourceControlSettings>().InCallScope();
197190
}
198191

199192
// note convention: abstract factory interface names end with "Factory".
@@ -220,7 +213,7 @@ private void BindCodeInspectionTypes()
220213
{
221214
var binding = Bind<IParseTreeInspection>()
222215
.To(inspection)
223-
.InSingletonScope()
216+
.InCallScope()
224217
.Named(inspection.FullName);
225218

226219
binding.Intercept().With<TimedCallLoggerInterceptor>();
@@ -231,7 +224,7 @@ private void BindCodeInspectionTypes()
231224
}
232225
else
233226
{
234-
var binding = Bind<IInspection>().To(inspection).InSingletonScope();
227+
var binding = Bind<IInspection>().To(inspection).InCallScope();
235228
binding.Intercept().With<TimedCallLoggerInterceptor>();
236229
binding.Intercept().With<EnumerableCounterInterceptor<InspectionResultBase>>();
237230
}
@@ -296,7 +289,7 @@ private void BindParentMenuItem<TParentMenu>(CommandBarControls parent, int befo
296289
{
297290
Bind<IParentMenuItem>().To(typeof(TParentMenu))
298291
.WhenInjectedInto<IAppMenu>()
299-
.InThreadScope()
292+
.InCallScope()
300293
.WithConstructorArgument("items", items)
301294
.WithConstructorArgument("beforeIndex", beforeIndex)
302295
.WithPropertyValue("Parent", parent);
@@ -318,7 +311,7 @@ private static int FindRubberduckMenuInsertionIndex(CommandBarControls controls,
318311
private void BindCommandsToMenuItems()
319312
{
320313
var types = Assembly.GetExecutingAssembly().GetTypes()
321-
.Where(type => type.IsClass && type.Namespace != null && type.Namespace.StartsWith(typeof(CommandBase).Namespace ?? String.Empty))
314+
.Where(type => type.IsClass && type.Namespace != null && type.Namespace.StartsWith(typeof(CommandBase).Namespace ?? string.Empty))
322315
.ToList();
323316

324317
// note: CommandBase naming convention: [Foo]Command
@@ -340,7 +333,7 @@ private void BindCommandsToMenuItems()
340333
binding.WhenInjectedInto<RubberduckHooks>().BindingConfiguration.Condition;
341334

342335
binding.When(request => whenCommandMenuItemCondition(request) || whenHooksCondition(request))
343-
.InSingletonScope();
336+
.InCallScope();
344337
}
345338
}
346339
catch (InvalidOperationException)

RetailCoder.VBE/Rubberduck.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,10 @@
253253
<HintPath>..\packages\Ninject.Extensions.Interception.DynamicProxy.3.2.0.0\lib\net45-full\Ninject.Extensions.Interception.DynamicProxy.dll</HintPath>
254254
<Private>True</Private>
255255
</Reference>
256+
<Reference Include="Ninject.Extensions.NamedScope, Version=3.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7, processorArchitecture=MSIL">
257+
<HintPath>..\packages\Ninject.Extensions.NamedScope.3.2.0.0\lib\net45-full\Ninject.Extensions.NamedScope.dll</HintPath>
258+
<Private>True</Private>
259+
</Reference>
256260
<Reference Include="PresentationCore" />
257261
<Reference Include="PresentationFramework" />
258262
<Reference Include="PresentationFramework.Aero" />

RetailCoder.VBE/Settings/CodeInspectionConfigProvider.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,7 @@
44

55
namespace Rubberduck.Settings
66
{
7-
public interface ICodeInspectionConfigProvider
8-
{
9-
CodeInspectionSettings Create();
10-
CodeInspectionSettings CreateDefaults();
11-
void Save(CodeInspectionSettings settings);
12-
}
13-
14-
public class CodeInspectionConfigProvider : ICodeInspectionConfigProvider
7+
public class CodeInspectionConfigProvider : IConfigProvider<CodeInspectionSettings>
158
{
169
private readonly IPersistanceService<CodeInspectionSettings> _persister;
1710

RetailCoder.VBE/Settings/ConfigurationLoader.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@ public interface IGeneralConfigService : IConfigurationService<Configuration>
2323

2424
public class ConfigurationLoader : IGeneralConfigService
2525
{
26-
private readonly IGeneralConfigProvider _generalProvider;
27-
private readonly IHotkeyConfigProvider _hotkeyProvider;
28-
private readonly IToDoListConfigProvider _todoProvider;
29-
private readonly ICodeInspectionConfigProvider _inspectionProvider;
30-
private readonly IUnitTestConfigProvider _unitTestProvider;
31-
private readonly IIndenterConfigProvider _indenterProvider;
26+
private readonly IConfigProvider<GeneralSettings> _generalProvider;
27+
private readonly IConfigProvider<HotkeySettings> _hotkeyProvider;
28+
private readonly IConfigProvider<ToDoListSettings> _todoProvider;
29+
private readonly IConfigProvider<CodeInspectionSettings> _inspectionProvider;
30+
private readonly IConfigProvider<UnitTestSettings> _unitTestProvider;
31+
private readonly IConfigProvider<IndenterSettings> _indenterProvider;
3232

33-
public ConfigurationLoader(IGeneralConfigProvider generalProvider, IHotkeyConfigProvider hotkeyProvider, IToDoListConfigProvider todoProvider,
34-
ICodeInspectionConfigProvider inspectionProvider, IUnitTestConfigProvider unitTestProvider, IIndenterConfigProvider indenterProvider)
33+
public ConfigurationLoader(IConfigProvider<GeneralSettings> generalProvider, IConfigProvider<HotkeySettings> hotkeyProvider, IConfigProvider<ToDoListSettings> todoProvider,
34+
IConfigProvider<CodeInspectionSettings> inspectionProvider, IConfigProvider<UnitTestSettings> unitTestProvider, IConfigProvider<IndenterSettings> indenterProvider)
3535
{
3636
_generalProvider = generalProvider;
3737
_hotkeyProvider = hotkeyProvider;

RetailCoder.VBE/Settings/GeneralConfigProvider.cs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,7 @@
33

44
namespace Rubberduck.Settings
55
{
6-
public interface IGeneralConfigProvider
7-
{
8-
GeneralSettings Create();
9-
GeneralSettings CreateDefaults();
10-
11-
void Save(GeneralSettings settings);
12-
}
13-
14-
public class GeneralConfigProvider : IGeneralConfigProvider
6+
public class GeneralConfigProvider : IConfigProvider<GeneralSettings>
157
{
168
private GeneralSettings _current;
179
private readonly IPersistanceService<GeneralSettings> _persister;

RetailCoder.VBE/Settings/HotkeyConfigProvider.cs

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,7 @@
22

33
namespace Rubberduck.Settings
44
{
5-
public interface IHotkeyConfigProvider
6-
{
7-
HotkeySettings Create();
8-
HotkeySettings CreateDefaults();
9-
void Save(HotkeySettings settings);
10-
}
11-
12-
public class HotkeyConfigProvider : IHotkeyConfigProvider
5+
public class HotkeyConfigProvider : IConfigProvider<HotkeySettings>
136
{
147
private readonly IPersistanceService<HotkeySettings> _persister;
158

@@ -19,7 +12,7 @@ public HotkeyConfigProvider(IPersistanceService<HotkeySettings> persister)
1912
}
2013

2114
public HotkeySettings Create()
22-
{
15+
{
2316
var prototype = new HotkeySettings();
2417
return _persister.Load(prototype) ?? prototype;
2518
}

RetailCoder.VBE/Settings/ToDoListConfigProvider.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,7 @@
22

33
namespace Rubberduck.Settings
44
{
5-
public interface IToDoListConfigProvider
6-
{
7-
ToDoListSettings Create();
8-
ToDoListSettings CreateDefaults();
9-
void Save(ToDoListSettings settings);
10-
}
11-
12-
public class ToDoListConfigProvider : IToDoListConfigProvider
5+
public class ToDoListConfigProvider : IConfigProvider<ToDoListSettings>
136
{
147
private readonly IPersistanceService<ToDoListSettings> _persister;
158

0 commit comments

Comments
 (0)