diff --git a/Needlework.Net/Program.cs b/Needlework.Net/Program.cs index 6afe695..d580d4c 100644 --- a/Needlework.Net/Program.cs +++ b/Needlework.Net/Program.cs @@ -12,6 +12,13 @@ using Needlework.Net.ViewModels.Pages.Endpoints; using Needlework.Net.ViewModels.Pages.Home; using Needlework.Net.ViewModels.Pages.Schemas; using Needlework.Net.ViewModels.Pages.WebSocket; +using Needlework.Net.Views.MainWindow; +using Needlework.Net.Views.Pages.About; +using Needlework.Net.Views.Pages.Console; +using Needlework.Net.Views.Pages.Endpoints; +using Needlework.Net.Views.Pages.Home; +using Needlework.Net.Views.Pages.Schemas; +using Needlework.Net.Views.Pages.WebSocket; using Projektanker.Icons.Avalonia; using Projektanker.Icons.Avalonia.FontAwesome; using Serilog; @@ -50,12 +57,46 @@ class Program private static IServiceProvider BuildServices() { var builder = new ServiceCollection(); + + AddViews(builder); AddViewModels(builder); AddServices(builder); return builder.BuildServiceProvider(); } + private static void AddViews(ServiceCollection builder) + { + var locator = new ViewLocator(); + // MAIN WINDOW + locator.Register(() => new NotificationView()); + locator.Register(() => new SchemaSearchDetailsView()); + locator.Register(() => new SchemaView()); + // ABOUT + locator.Register(() => new AboutView()); + // CONSOLE + locator.Register(() => new ConsoleView()); + // ENDPOINTS + locator.Register(() => new EndpointListView()); + locator.Register(() => new EndpointSearchDetailsView()); + locator.Register(() => new EndpointsView()); + locator.Register(() => new EndpointTabItemContentView()); + locator.Register(() => new PathOperationView()); + locator.Register(() => new PluginView()); + locator.Register(() => new PropertyClassView()); + // HOME + locator.Register(() => new HomeView()); + locator.Register(() => new LibraryView()); + // SCHEMAS + locator.Register(() => new SchemasView()); + locator.Register(() => new SchemaItemView()); + // WEBSOCKET + locator.Register(() => new WebSocketView()); + locator.Register(() => new EventView()); + + builder.AddSingleton(locator); + } + private static void AddServices(ServiceCollection builder) { builder.AddSingleton(); @@ -67,7 +108,6 @@ class Program .Add("Client")); builder.AddLogging((builder) => builder.AddSerilog(EnableLoggerExtensions.Log(null))); - builder.AddSingleton(new ViewLocator()); } private static void AddViewModels(ServiceCollection builder) diff --git a/Needlework.Net/ViewLocator.cs b/Needlework.Net/ViewLocator.cs index 7ba73ea..8160fac 100644 --- a/Needlework.Net/ViewLocator.cs +++ b/Needlework.Net/ViewLocator.cs @@ -7,8 +7,6 @@ using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Reflection; namespace Needlework.Net { @@ -40,6 +38,8 @@ namespace Needlework.Net .WithMetrics() .Build(); + private readonly Dictionary> _viewRegister = []; + public ViewLocator() { _controlCache.Events.Value!.ItemRemoved += (source, args) => @@ -55,32 +55,23 @@ namespace Needlework.Net }; } + public void Register(Func viewActivator) + where T : INotifyPropertyChanged + { + _viewRegister[typeof(T)] = viewActivator; + } + public Control Build(object? data) { - var name = data?.GetType().Name; - if (name is null) + if (!_viewRegister.TryGetValue(data!.GetType(), out var activator)) { - throw new Exception("Data type name is null."); - } - if (!name.Contains("ViewModel")) - { - throw new Exception("Data type name must end with 'ViewModel'."); + throw new Exception("Data type has no registered view activator."); } - name = name.Replace("ViewModel", "View"); - var type = Assembly.GetExecutingAssembly() - .GetTypes() - .Where(t => t.Name == name) - .FirstOrDefault(); - - if (type is null) - { - throw new Exception("Data type has no view."); - } bool isCold = !_controlCache.TryGet(data!, out var res); if (isCold) { - res ??= (Control)Activator.CreateInstance(type)!; + res ??= activator(); _controlCache.AddOrUpdate(data!, res); }