From 370e6bf96b90b3c3e33b4f04fe6732186d010a4c Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Sat, 15 Jun 2024 11:09:15 +0100 Subject: [PATCH] WIP --- Toolkit.Avalonia/ContentDialogHandler.cs | 5 --- Toolkit.Avalonia/ContentTemplate.cs | 6 ---- Toolkit.Avalonia/FrameHandler.cs | 5 --- Toolkit.Foundation/ContentFactory.cs | 26 ++++------------ Toolkit.Foundation/IPostInitialization.cs | 6 ---- .../IServiceProviderExtensions.cs | 17 ---------- Toolkit.Foundation/Observable.cs | 20 +++--------- Toolkit.Foundation/ObservableCollection.cs | 31 +++++++------------ Toolkit.Foundation/ServiceFactory.cs | 2 +- 9 files changed, 22 insertions(+), 96 deletions(-) delete mode 100644 Toolkit.Foundation/IPostInitialization.cs delete mode 100644 Toolkit.Foundation/IServiceProviderExtensions.cs diff --git a/Toolkit.Avalonia/ContentDialogHandler.cs b/Toolkit.Avalonia/ContentDialogHandler.cs index d4f76bb..7529e80 100644 --- a/Toolkit.Avalonia/ContentDialogHandler.cs +++ b/Toolkit.Avalonia/ContentDialogHandler.cs @@ -129,11 +129,6 @@ public class ContentDialogHandler(IDispatcher dispatcher) : // A hack to wait for the dialog to finish loading up to make it appear more responsive await Task.Delay(250); - if (content is IInitialization initializer) - { - await initializer.Initialize(); - } - if (content is IActivated activated) { await activated.OnActivated(); diff --git a/Toolkit.Avalonia/ContentTemplate.cs b/Toolkit.Avalonia/ContentTemplate.cs index 73ac15f..b7f3c4a 100644 --- a/Toolkit.Avalonia/ContentTemplate.cs +++ b/Toolkit.Avalonia/ContentTemplate.cs @@ -17,7 +17,6 @@ public class ContentTemplate : if (observableViewModel.Provider is IServiceProvider provider) { Type itemType = item.GetType(); - if (provider.GetRequiredKeyedService(itemType.Name.Replace("ViewModel", "")) is IContentTemplateDescriptor descriptor) { @@ -28,11 +27,6 @@ public class ContentTemplate : control.Loaded -= HandleLoaded; if (control.DataContext is object content) { - if (content is IInitialization initializer) - { - await initializer.Initialize(); - } - if (content is IActivated activated) { await activated.OnActivated(); diff --git a/Toolkit.Avalonia/FrameHandler.cs b/Toolkit.Avalonia/FrameHandler.cs index 59d1bba..273f861 100644 --- a/Toolkit.Avalonia/FrameHandler.cs +++ b/Toolkit.Avalonia/FrameHandler.cs @@ -72,11 +72,6 @@ public class FrameHandler : sender.AddHandler(Frame.NavigatingFromEvent, HandleNavigatingFrom); if (sender.DataContext is object content) { - if (content is IInitialization initializer) - { - await initializer.Initialize(); - } - if (content is IActivated activated) { await activated.OnActivated(); diff --git a/Toolkit.Foundation/ContentFactory.cs b/Toolkit.Foundation/ContentFactory.cs index cfc5722..6c4b35a 100644 --- a/Toolkit.Foundation/ContentFactory.cs +++ b/Toolkit.Foundation/ContentFactory.cs @@ -17,29 +17,15 @@ public class ContentFactory(IMediator mediator, content = await mediator.Handle(descriptor.ContentType, createEvent, descriptor.Key); } - if (content is null) - { - if (parameters is { Length: > 0 }) - { - content = factory.Create(descriptor.ContentType, args => + content ??= parameters is { Length: > 0 } + ? factory.Create(descriptor.ContentType, args => { - if (args is IPostInitialization initialization) + if (args is IInitialization initialization) { - initialization.PostInitialize(); + initialization.Initialize(); } - }, parameters); - } - else - { - content = provider.GetRequiredKeyedService(descriptor.ContentType, args => - { - if (args is IPostInitialization initialization) - { - initialization.PostInitialize(); - } - }, descriptor.Key); - } - } + }, parameters) + : provider.GetRequiredKeyedService(descriptor.ContentType, descriptor.Key); return content; } diff --git a/Toolkit.Foundation/IPostInitialization.cs b/Toolkit.Foundation/IPostInitialization.cs deleted file mode 100644 index 9231dda..0000000 --- a/Toolkit.Foundation/IPostInitialization.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Toolkit.Foundation; - -public interface IPostInitialization -{ - void PostInitialize(); -} \ No newline at end of file diff --git a/Toolkit.Foundation/IServiceProviderExtensions.cs b/Toolkit.Foundation/IServiceProviderExtensions.cs deleted file mode 100644 index b32a901..0000000 --- a/Toolkit.Foundation/IServiceProviderExtensions.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace Toolkit.Foundation; - -public static class IServiceProviderExtensions -{ - public static object GetRequiredKeyedService(this IServiceProvider provider, - Type serviceType, - Action serviceDelegate, - object? serviceKey) - { - object service = provider.GetRequiredKeyedService(serviceType, serviceKey); - serviceDelegate.Invoke(service); - - return service; - } -} diff --git a/Toolkit.Foundation/Observable.cs b/Toolkit.Foundation/Observable.cs index b8788d5..420c77c 100644 --- a/Toolkit.Foundation/Observable.cs +++ b/Toolkit.Foundation/Observable.cs @@ -2,8 +2,7 @@ namespace Toolkit.Foundation; -public partial class Observable(IServiceProvider - provider, +public partial class Observable(IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, @@ -12,7 +11,6 @@ public partial class Observable(IServiceProvider ObservableObject, IObservableViewModel, IActivityIndicator, - IPostInitialization, IInitialization, IActivated, IDeactivating, @@ -32,7 +30,6 @@ public partial class Observable(IServiceProvider [ObservableProperty] private bool initialized; - private bool postInitialized; public event EventHandler? DeactivateHandler; @@ -67,7 +64,7 @@ public partial class Observable(IServiceProvider Disposer.Dispose(this); } - public Task Initialize() + public virtual Task Initialize() { if (Initialized) { @@ -75,6 +72,8 @@ public partial class Observable(IServiceProvider } Initialized = true; + + Subscriber.Subscribe(this); return Task.CompletedTask; } @@ -87,17 +86,6 @@ public partial class Observable(IServiceProvider public virtual Task OnDeactivating() => Task.CompletedTask; - public virtual void PostInitialize() - { - if (postInitialized) - { - return; - } - - postInitialized = true; - Subscriber.Subscribe(this); - } - public void Revert() { foreach (object trackedProperty in trackedProperties.Values) diff --git a/Toolkit.Foundation/ObservableCollection.cs b/Toolkit.Foundation/ObservableCollection.cs index 73885bf..38e959a 100644 --- a/Toolkit.Foundation/ObservableCollection.cs +++ b/Toolkit.Foundation/ObservableCollection.cs @@ -9,7 +9,6 @@ namespace Toolkit.Foundation; public partial class ObservableCollection : ObservableObject, IObservableCollectionViewModel, - IPostInitialization, IInitialization, IActivated, IDeactivating, @@ -50,11 +49,10 @@ public partial class ObservableCollection : [ObservableProperty] private int count; + [ObservableProperty] private bool initialized; - private bool postInitialized; - [ObservableProperty] private TItem? selectedItem; @@ -118,6 +116,7 @@ public partial class ObservableCollection : public IServiceProvider Provider { get; private set; } public IPublisher Publisher { get; private set; } + public ISubscriber Subscriber { get; } object ICollection.SyncRoot => this; @@ -151,11 +150,11 @@ public partial class ObservableCollection : where T : TItem { - T? item = Factory.Create(args => - { - if (args is IPostInitialization initialization) + T? item = Factory.Create(args => + { + if (args is IInitialization initialization) { - initialization.PostInitialize(); + initialization.Initialize(); } }, parameters); @@ -208,6 +207,7 @@ public partial class ObservableCollection : Clear(); factory.Invoke(this); } + public void Clear() { clearing = true; @@ -411,6 +411,8 @@ public partial class ObservableCollection : } Initialized = true; + + Subscriber.Subscribe(this); Synchronize(); return Task.CompletedTask; @@ -423,9 +425,9 @@ public partial class ObservableCollection : { T? item = Factory.Create(args => { - if (args is IPostInitialization initialization) + if (args is IInitialization initialization) { - initialization.PostInitialize(); + initialization.Initialize(); } }, parameters); @@ -521,17 +523,6 @@ public partial class ObservableCollection : public virtual Task OnDeactivating() => Task.CompletedTask; - public virtual void PostInitialize() - { - if (postInitialized) - { - return; - } - - postInitialized = true; - Subscriber.Subscribe(this); - } - public bool Remove(TItem item) { int index = collection.IndexOf(item); diff --git a/Toolkit.Foundation/ServiceFactory.cs b/Toolkit.Foundation/ServiceFactory.cs index 74d4dfd..4c9207c 100644 --- a/Toolkit.Foundation/ServiceFactory.cs +++ b/Toolkit.Foundation/ServiceFactory.cs @@ -18,7 +18,7 @@ public class ServiceFactory(Func factory) : public object Create(Type type, params object?[]? parameters) => factory(type, parameters); - public object Create(Type type, Action serviceDelegate, + public object Create(Type type, Action serviceDelegate, params object?[]? parameters) { object service = factory(type, parameters);