Skip to content

Commit 19077c0

Browse files
committed
Migrate from MEF to Autofac
1 parent 1421c9d commit 19077c0

File tree

73 files changed

+306
-321
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+306
-321
lines changed

src/MusicManager/.editorconfig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,6 @@ csharp_style_expression_bodied_methods = when_on_single_line
3333

3434
# IDE0061: Use block body for local functions
3535
csharp_style_expression_bodied_local_functions = when_on_single_line
36+
37+
# IDE0160: Convert to block scoped namespace
38+
csharp_style_namespace_declarations = file_scoped

src/MusicManager/Directory.Packages.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
44
</PropertyGroup>
55
<ItemGroup>
6+
<PackageVersion Include="Autofac" Version="8.3.0" />
67
<PackageVersion Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.1742" />
78
<PackageVersion Include="NLog" Version="5.5.0" />
89
<PackageVersion Include="System.Waf.Core" Version="8.1.0" />
Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,37 @@
1-
using Microsoft.VisualStudio.TestTools.UnitTesting;
2-
using System.ComponentModel.Composition;
3-
using System.ComponentModel.Composition.Hosting;
1+
using Autofac;
2+
using Microsoft.VisualStudio.TestTools.UnitTesting;
43
using System.Waf.UnitTesting;
5-
using System.Waf.UnitTesting.Mocks;
64
using Test.MusicManager.Domain;
5+
using Waf.MusicManager.Applications;
76
using Waf.MusicManager.Applications.Properties;
87
using Waf.MusicManager.Applications.Services;
9-
using Waf.MusicManager.Applications.ViewModels;
108
using Waf.MusicManager.Domain.MusicFiles;
9+
using IContainer = Autofac.IContainer;
1110

1211
namespace Test.MusicManager.Applications;
1312

1413
[TestClass]
1514
public abstract class ApplicationsTest : DomainTest
1615
{
17-
private AggregateCatalog? catalog;
18-
1916
protected UnitTestSynchronizationContext Context { get; private set; } = null!;
2017

21-
protected CompositionContainer Container { get; private set; } = null!;
18+
protected IContainer Container { get; private set; } = null!;
19+
20+
public T Get<T>() where T : notnull => Container.Resolve<T>();
21+
22+
public Lazy<T> GetLazy<T>() where T : notnull => new(Get<T>);
2223

2324
protected override void OnInitialize()
2425
{
2526
base.OnInitialize();
2627

2728
Context = UnitTestSynchronizationContext.Create();
2829

29-
catalog = new();
30-
OnCatalogInitialize(catalog);
31-
32-
Container = new(catalog, CompositionOptions.DisableSilentRejection);
33-
var batch = new CompositionBatch();
34-
batch.AddExportedValue(Container);
35-
Container.Compose(batch);
30+
var builder = new ContainerBuilder();
31+
ConfigureContainer(builder);
32+
Container = builder.Build();
3633

37-
var shellService = Container.GetExportedValue<ShellService>();
34+
var shellService = Container.Resolve<ShellService>();
3835
shellService.Settings = new AppSettings();
3936

4037
ServiceLocator.RegisterInstance<IChangeTrackerService>(new ChangeTrackerService());
@@ -43,15 +40,13 @@ protected override void OnInitialize()
4340
protected override void OnCleanup()
4441
{
4542
Container.Dispose();
46-
catalog?.Dispose();
4743
Context.Dispose();
4844
base.OnCleanup();
4945
}
5046

51-
protected virtual void OnCatalogInitialize(AggregateCatalog catalog)
47+
protected virtual void ConfigureContainer(ContainerBuilder builder)
5248
{
53-
catalog.Catalogs.Add(new AssemblyCatalog(typeof(ShellViewModel).Assembly));
54-
catalog.Catalogs.Add(new AssemblyCatalog(typeof(MockMessageService).Assembly));
55-
catalog.Catalogs.Add(new AssemblyCatalog(typeof(ApplicationsTest).Assembly));
49+
builder.RegisterModule(new ApplicationsModule());
50+
builder.RegisterModule(new MockPresentationModule());
5651
}
5752
}

src/MusicManager/MusicManager.Applications.Test/Controllers/ManagerControllerTest.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ public class ManagerControllerTest : ApplicationsTest
2121
protected override void OnInitialize()
2222
{
2323
base.OnInitialize();
24-
controller = Container.GetExportedValue<ManagerController>();
24+
controller = Get<ManagerController>();
2525
controller.Initialize();
2626

27-
shellService = Container.GetExportedValue<ShellService>();
28-
selectionService = Container.GetExportedValue<SelectionService>();
29-
managerStatusService = Container.GetExportedValue<IManagerStatusService>();
27+
shellService = Get<ShellService>();
28+
selectionService = Get<SelectionService>();
29+
managerStatusService = Get<IManagerStatusService>();
3030
var view = (MockManagerView)shellService.ContentView!;
3131
viewModel = ViewHelper.GetViewModel<ManagerViewModel>(view)!;
3232
}
@@ -42,10 +42,10 @@ protected override void OnCleanup()
4242
public void FileSystemWatcherService()
4343
{
4444
var path = @"C:\Music";
45-
var fileService = Container.GetExportedValue<MockFileService>();
45+
var fileService = Get<MockFileService>();
4646
fileService.GetFilesStub = (dir, deep, f1, f2, c) => Task.FromResult<IReadOnlyList<string>>([ Path.Combine(path, "TestMP3.mp3"), Path.Combine(path, "Test42.mp3") ]);
4747

48-
var fileSystemWatcherService = Container.GetExportedValue<MockFileSystemWatcherService>();
48+
var fileSystemWatcherService = Get<MockFileSystemWatcherService>();
4949
viewModel.FolderBrowser.CurrentPath = path;
5050
Assert.IsTrue(path.Equals(fileSystemWatcherService.Path, StringComparison.OrdinalIgnoreCase));
5151
Assert.IsTrue(fileSystemWatcherService.EnableRaisingEvents);

src/MusicManager/MusicManager.Applications.Test/Controllers/MusicPropertiesControllerTest.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,20 @@ protected override void OnInitialize()
2626
{
2727
base.OnInitialize();
2828

29-
musicFileContext = Container.GetExportedValue<MockMusicFileContext>();
29+
musicFileContext = Get<MockMusicFileContext>();
3030
musicFiles = [
3131
musicFileContext.Create(@"C:\Users\Public\Music\Dancefloor\Culture Beat - Serenity.wav"),
3232
musicFileContext.Create(@"C:\Culture Beat - Serenity - Epilog.wma"),
3333
];
34-
selectionService = Container.GetExportedValue<SelectionService>();
34+
selectionService = Get<SelectionService>();
3535
selectionService.Initialize(musicFiles);
3636

3737
playlistManager = new();
38-
controller = Container.GetExportedValue<MusicPropertiesController>();
38+
controller = Get<MusicPropertiesController>();
3939
controller.PlaylistManager = playlistManager;
4040
controller.Initialize();
4141

42-
var shellService = Container.GetExportedValue<ShellService>();
42+
var shellService = Get<ShellService>();
4343
view = (MockMusicPropertiesView)shellService.MusicPropertiesView!;
4444
viewModel = ViewHelper.GetViewModel<MusicPropertiesViewModel>(view)!;
4545
}
@@ -103,7 +103,7 @@ public void SaveChangesErrorTest()
103103
return tcs.Task;
104104
};
105105

106-
var shellService = Container.GetExportedValue<ShellService>();
106+
var shellService = Get<ShellService>();
107107
var showErrorCalled = false;
108108
shellService.ShowErrorAction = (ex, msg) =>
109109
{
@@ -158,7 +158,7 @@ public void SaveChangesWhilePlayingMusicFile()
158158
// 2. save unsaved files because they were played until now
159159
selectionService.MusicFiles[0].MusicFile.Metadata!.Rating = 75;
160160
selectionService.MusicFiles[1].MusicFile.Metadata!.Rating = 75;
161-
var shellService = Container.GetExportedValue<ShellService>();
161+
var shellService = Get<ShellService>();
162162
musicFileToSave = musicFiles[0];
163163
controller.Shutdown();
164164
var tasks = shellService.TasksToCompleteBeforeShutdown.ToArray();

src/MusicManager/MusicManager.Applications.Test/Controllers/PlayerControllerTest.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,22 @@ protected override void OnInitialize()
2929
{
3030
base.OnInitialize();
3131

32-
var musicFileContext = Container.GetExportedValue<MockMusicFileContext>();
32+
var musicFileContext = Get<MockMusicFileContext>();
3333
musicFiles = [
3434
musicFileContext.Create(@"C:\Users\Public\Music\Dancefloor\Culture Beat - Serenity.wav"),
3535
musicFileContext.Create(@"C:\Culture Beat - Serenity - Epilog.wma"),
3636
];
37-
selectionService = Container.GetExportedValue<SelectionService>();
37+
selectionService = Get<SelectionService>();
3838
selectionService.Initialize(musicFiles);
3939

4040
playlistManager = new();
4141
playlistSettings = new();
42-
controller = Container.GetExportedValue<PlayerController>();
42+
controller = Get<PlayerController>();
4343
controller.PlaylistSettings = playlistSettings;
4444
controller.PlaylistManager = playlistManager;
4545
controller.Initialize();
4646

47-
shellService = Container.GetExportedValue<ShellService>();
47+
shellService = Get<ShellService>();
4848
shellService.ShowPlaylistViewAction = () => { };
4949
shellService.ShowMusicPropertiesViewAction = () => { };
5050
view = (MockPlayerView)shellService.PlayerView!;
@@ -62,14 +62,14 @@ protected override void OnCleanup()
6262
public void PassMusicFileViaCommandLineParameter()
6363
{
6464
// Simulate that a music file was passed via command line parameter
65-
var environmentService = Container.GetExportedValue<MockEnvironmentService>();
65+
var environmentService = Get<MockEnvironmentService>();
6666
environmentService.MusicFilesToLoad = new[] { musicFiles.First().FileName! };
6767

6868
// Another controller is responsible to add first the item into the playlist.
6969
playlistManager.InsertItems(0, musicFiles.Select(x => new PlaylistItem(x)));
7070

7171
// Now auto-play the file.
72-
var playerService = Container.GetExportedValue<PlayerService>();
72+
var playerService = Get<PlayerService>();
7373
playerService.IsPlayCommand = true;
7474
bool playPauseCommandCalled = false;
7575
playerService.PlayPauseCommand = new DelegateCommand(() => playPauseCommandCalled = true);
@@ -109,7 +109,7 @@ public void PlayAllAndSelected()
109109
Assert.AreEqual(1, playlistManager.Items.Count);
110110

111111
// Play all
112-
var playerService = Container.GetExportedValue<PlayerService>();
112+
var playerService = Get<PlayerService>();
113113
playerService.IsPlayCommand = true;
114114
bool playPauseCommandCalled = false;
115115
playerService.PlayPauseCommand = new DelegateCommand(() => playPauseCommandCalled = true);
@@ -199,7 +199,7 @@ public void ShowMusicProperties()
199199
shellService.ShowMusicPropertiesViewAction = () => { showMusicPropertiesViewActionCalled = true; };
200200
viewModel.ShowMusicPropertiesCommand.Execute(null);
201201
Assert.IsTrue(showMusicPropertiesViewActionCalled);
202-
var musicPropertiesViewModel = Container.GetExportedValue<MusicPropertiesViewModel>();
202+
var musicPropertiesViewModel = Get<MusicPropertiesViewModel>();
203203
Assert.AreEqual(playlistManager.CurrentItem!.MusicFile, musicPropertiesViewModel.MusicFile);
204204
}
205205

@@ -210,7 +210,7 @@ public void ShowPlaylist()
210210
viewModel.PlayerService.PlayAllCommand.Execute(null);
211211
shellService.ShowMusicPropertiesView();
212212

213-
var playlistController = Container.GetExportedValue<PlaylistController>();
213+
var playlistController = Get<PlaylistController>();
214214
playlistController.PlaylistManager = playlistManager;
215215
playlistController.Initialize();
216216

@@ -219,7 +219,7 @@ public void ShowPlaylist()
219219
viewModel.ShowPlaylistCommand.Execute(null);
220220
Assert.IsTrue(showPlaylistViewActionCalled);
221221

222-
var playlistViewModel = Container.GetExportedValue<PlaylistViewModel>();
222+
var playlistViewModel = Get<PlaylistViewModel>();
223223
Assert.AreEqual(playlistManager.CurrentItem, playlistViewModel.SelectedPlaylistItem);
224224
}
225225
}

src/MusicManager/MusicManager.Applications.Test/Controllers/PlaylistControllerTest.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,22 @@ protected override void OnInitialize()
2626
{
2727
base.OnInitialize();
2828

29-
musicFileContext = Container.GetExportedValue<MockMusicFileContext>();
29+
musicFileContext = Get<MockMusicFileContext>();
3030
musicFiles = [
3131
musicFileContext.Create(@"C:\Users\Public\Music\Dancefloor\Culture Beat - Serenity.wav"),
3232
musicFileContext.Create(@"C:\Culture Beat - Serenity - Epilog.wma"),
3333
];
34-
selectionService = Container.GetExportedValue<SelectionService>();
34+
selectionService = Get<SelectionService>();
3535
selectionService.Initialize(musicFiles);
3636

3737
playlistManager = new();
38-
controller = Container.GetExportedValue<PlaylistController>();
38+
controller = Get<PlaylistController>();
3939
controller.PlaylistSettings = new();
4040
controller.PlaylistManager = playlistManager;
4141
controller.Initialize();
4242
controller.Run();
4343

44-
shellService = Container.GetExportedValue<ShellService>();
44+
shellService = Get<ShellService>();
4545
var view = shellService.PlaylistView!;
4646
viewModel = ViewHelper.GetViewModel<PlaylistViewModel>((IView)view)!;
4747
}
@@ -70,7 +70,7 @@ public void PlayAndRemoveSelectedTest()
7070
Assert.IsTrue(viewModel.RemoveSelectedCommand.CanExecute(null));
7171

7272
// Play the selected item
73-
var playerService = Container.GetExportedValue<PlayerService>();
73+
var playerService = Get<PlayerService>();
7474
playerService.IsPlayCommand = true;
7575
bool playPauseCalled = false;
7676
playerService.PlayPauseCommand = new DelegateCommand(() => playPauseCalled = true);
@@ -102,7 +102,7 @@ public void PlayAndRemoveSelectedTest()
102102
public void ShowMusicPropertiesTest()
103103
{
104104
// Initialize the MusicPropertiesController
105-
var musicPropertiesController = Container.GetExportedValue<MusicPropertiesController>();
105+
var musicPropertiesController = Get<MusicPropertiesController>();
106106
musicPropertiesController.PlaylistManager = playlistManager;
107107
musicPropertiesController.Initialize();
108108

src/MusicManager/MusicManager.Applications.Test/Controllers/TranscodingControllerTest.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ protected override void OnInitialize()
2020
{
2121
base.OnInitialize();
2222

23-
musicFileContext = Container.GetExportedValue<MockMusicFileContext>();
23+
musicFileContext = Get<MockMusicFileContext>();
2424
musicFiles = [
2525
musicFileContext.Create(@"C:\Users\Public\Music\Dancefloor\Culture Beat - Serenity.wav"),
2626
musicFileContext.Create(@"C:\Culture Beat - Serenity - Epilog.wma"),
2727
];
28-
selectionService = Container.GetExportedValue<SelectionService>();
28+
selectionService = Get<SelectionService>();
2929
selectionService.Initialize(musicFiles);
3030

3131
musicFiles[0].Metadata!.Album = "Serenity";
@@ -34,10 +34,10 @@ protected override void OnInitialize()
3434
[TestMethod]
3535
public void ConvertToMp3Selected()
3636
{
37-
var controller = Container.GetExportedValue<TranscodingController>();
37+
var controller = Get<TranscodingController>();
3838
controller.Initialize();
3939

40-
var shellService = Container.GetExportedValue<ShellService>();
40+
var shellService = Get<ShellService>();
4141
var view = shellService.TranscodingListView!.Value;
4242
var viewModel = ViewHelper.GetViewModel<TranscodingListViewModel>((IView)view)!;
4343
var transcodingService = viewModel.TranscodingService;
@@ -62,7 +62,7 @@ public void ConvertToMp3Selected()
6262
bool transcodeCalled = false;
6363
Task transcodeDelayTask = Task.CompletedTask;
6464
Exception? transcodeError = null;
65-
var transcode = Container.GetExportedValue<MockTranscoder>();
65+
var transcode = Get<MockTranscoder>();
6666
transcode.TranscodeAsyncAction = async (sourceFileName, destinationFileName, bitrate, cancellationToken, progress) =>
6767
{
6868
transcodeCalled = true;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using Autofac;
2+
using System.Waf.Applications.Services;
3+
using System.Waf.UnitTesting.Mocks;
4+
using Test.MusicManager.Applications.Services;
5+
using Test.MusicManager.Applications.Views;
6+
using Waf.MusicManager.Applications.Services;
7+
using Waf.MusicManager.Applications.Views;
8+
9+
namespace Test.MusicManager.Applications;
10+
11+
public class MockPresentationModule(bool useMock = true) : Module
12+
{
13+
protected override void Load(ContainerBuilder builder)
14+
{
15+
builder.RegisterType<MockFileDialogService>().As<IFileDialogService>().AsSelf().SingleInstance();
16+
builder.RegisterType<MockMessageService>().As<IMessageService>().AsSelf().SingleInstance();
17+
builder.RegisterType<MockSettingsService>().As<ISettingsService>().AsSelf().SingleInstance();
18+
19+
builder.RegisterType<MockClipboardService>().As<IClipboardService>().AsSelf().SingleInstance();
20+
builder.RegisterType<MockEnvironmentService>().As<IEnvironmentService>().AsSelf().SingleInstance();
21+
22+
if (useMock)
23+
{
24+
builder.RegisterType<MockFileService>().As<IFileService>().AsSelf().SingleInstance();
25+
builder.RegisterType<MockFileSystemWatcherService>().As<IFileSystemWatcherService>().AsSelf().SingleInstance();
26+
builder.RegisterType<MockMusicFileContext>().As<IMusicFileContext>().AsSelf().SingleInstance();
27+
builder.RegisterType<MockTranscoder>().As<ITranscoder>().AsSelf().SingleInstance();
28+
}
29+
30+
builder.RegisterType<MockInfoView>().As<IInfoView>();
31+
builder.RegisterType<MockManagerView>().As<IManagerView>().AsSelf().SingleInstance();
32+
builder.RegisterType<MockMusicPropertiesView>().As<IMusicPropertiesView>().AsSelf().SingleInstance();
33+
builder.RegisterType<MockPlayerView>().As<IPlayerView>().AsSelf().SingleInstance();
34+
builder.RegisterType<MockPlaylistView>().As<IPlaylistView>().AsSelf().SingleInstance();
35+
builder.RegisterType<MockShellView>().As<IShellView>().AsSelf().SingleInstance();
36+
builder.RegisterType<MockTranscodingListView>().As<ITranscodingListView>().AsSelf().SingleInstance();
37+
}
38+
}

src/MusicManager/MusicManager.Applications.Test/Services/MockClipboardService.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
using System.ComponentModel.Composition;
2-
using Waf.MusicManager.Applications.Services;
1+
using Waf.MusicManager.Applications.Services;
32

43
namespace Test.MusicManager.Applications.Services;
54

6-
[Export, Export(typeof(IClipboardService))]
75
public class MockClipboardService : IClipboardService
86
{
97
public Action<string>? SetTextAction { get; set; }

0 commit comments

Comments
 (0)