Fixed InitializationScoped

This commit is contained in:
Dan Clark
2024-12-05 16:11:48 +00:00
parent 6454e1bb6f
commit 8bbfc415e6
3 changed files with 35 additions and 5 deletions
+2 -4
View File
@@ -1,6 +1,4 @@
namespace Toolkit.Foundation; namespace Toolkit.Foundation;
public interface IInitializationScoped public interface IInitializationScoped :
{ IInitialization;
void Initialize();
}
@@ -62,12 +62,16 @@ public static class IServiceCollectionExtensions
if (key is { Length: > 0 }) if (key is { Length: > 0 })
{ {
services.Add(new ServiceDescriptor(typeof(IAsyncHandler<TMessage, TResponse>), key, typeof(THandler), lifetime)); services.Add(new ServiceDescriptor(typeof(IAsyncHandler<TMessage, TResponse>), key, typeof(THandler), lifetime));
services.AddInitializationScoped<AsyncHandlerKeyedInitialization<TMessage, TResponse, IAsyncHandler<TMessage, TResponse>>>(key); services.AddInitializationScoped<AsyncHandlerKeyedInitialization<TMessage, TResponse, IAsyncHandler<TMessage, TResponse>>>(key);
services.AddInitialization<AsyncHandlerKeyedInitialization<TMessage, TResponse, IAsyncHandler<TMessage, TResponse>>>(key);
} }
else else
{ {
services.Add(new ServiceDescriptor(typeof(IAsyncHandler<TMessage, TResponse>), typeof(THandler), lifetime)); services.Add(new ServiceDescriptor(typeof(IAsyncHandler<TMessage, TResponse>), typeof(THandler), lifetime));
services.AddInitializationScoped<AsyncHandlerInitialization<TMessage, TResponse, IAsyncHandler<TMessage, TResponse>>>(); services.AddInitializationScoped<AsyncHandlerInitialization<TMessage, TResponse, IAsyncHandler<TMessage, TResponse>>>();
services.AddInitialization<AsyncHandlerInitialization<TMessage, TResponse, IAsyncHandler<TMessage, TResponse>>>();
} }
return services; return services;
@@ -85,12 +89,16 @@ public static class IServiceCollectionExtensions
if (key is { Length: > 0 }) if (key is { Length: > 0 })
{ {
services.Add(new ServiceDescriptor(typeof(IAsyncHandler<TMessage>), key, typeof(THandler), lifetime)); services.Add(new ServiceDescriptor(typeof(IAsyncHandler<TMessage>), key, typeof(THandler), lifetime));
services.AddInitializationScoped<AsyncHandlerKeyedInitialization<TMessage, IAsyncHandler<TMessage>>>(key); services.AddInitializationScoped<AsyncHandlerKeyedInitialization<TMessage, IAsyncHandler<TMessage>>>(key);
services.AddInitialization<AsyncHandlerKeyedInitialization<TMessage, IAsyncHandler<TMessage>>>(key);
} }
else else
{ {
services.Add(new ServiceDescriptor(typeof(IAsyncHandler<TMessage>), typeof(THandler), lifetime)); services.Add(new ServiceDescriptor(typeof(IAsyncHandler<TMessage>), typeof(THandler), lifetime));
services.AddInitializationScoped<AsyncHandlerInitialization<TMessage, IAsyncHandler<TMessage>>>(); services.AddInitializationScoped<AsyncHandlerInitialization<TMessage, IAsyncHandler<TMessage>>>();
services.AddInitialization<AsyncHandlerInitialization<TMessage, IAsyncHandler<TMessage>>>();
} }
return services; return services;
@@ -220,12 +228,16 @@ public static class IServiceCollectionExtensions
if (key is { Length: > 0 }) if (key is { Length: > 0 })
{ {
services.Add(new ServiceDescriptor(typeof(IHandler<TMessage>), key, typeof(THandler), lifetime)); services.Add(new ServiceDescriptor(typeof(IHandler<TMessage>), key, typeof(THandler), lifetime));
services.AddInitializationScoped<HandlerKeyedInitialization<TMessage, IHandler<TMessage>>>(key); services.AddInitializationScoped<HandlerKeyedInitialization<TMessage, IHandler<TMessage>>>(key);
services.AddInitialization<HandlerKeyedInitialization<TMessage, IHandler<TMessage>>>(key);
} }
else else
{ {
services.Add(new ServiceDescriptor(typeof(IHandler<TMessage>), typeof(THandler), lifetime)); services.Add(new ServiceDescriptor(typeof(IHandler<TMessage>), typeof(THandler), lifetime));
services.AddInitializationScoped<HandlerInitialization<TMessage, IHandler<TMessage>>>(); services.AddInitializationScoped<HandlerInitialization<TMessage, IHandler<TMessage>>>();
services.AddInitialization<HandlerInitialization<TMessage, IHandler<TMessage>>>();
} }
return services; return services;
@@ -240,15 +252,21 @@ public static class IServiceCollectionExtensions
string? key = null) where THandler : class, IHandler<TMessage, TResponse> string? key = null) where THandler : class, IHandler<TMessage, TResponse>
where TMessage : class where TMessage : class
{ {
services.AddHandler<TMessage, TResponse, THandler>(lifetime, key);
if (key is { Length: > 0 }) if (key is { Length: > 0 })
{ {
services.Add(new ServiceDescriptor(typeof(IHandler<TMessage, TResponse>), key, typeof(THandler), lifetime)); services.Add(new ServiceDescriptor(typeof(IHandler<TMessage, TResponse>), key, typeof(THandler), lifetime));
services.AddInitializationScoped<HandlerKeyedInitialization<TMessage, TResponse, IHandler<TMessage, TResponse>>>(key); services.AddInitializationScoped<HandlerKeyedInitialization<TMessage, TResponse, IHandler<TMessage, TResponse>>>(key);
services.AddInitialization<HandlerKeyedInitialization<TMessage, TResponse, IHandler<TMessage, TResponse>>>(key);
} }
else else
{ {
services.Add(new ServiceDescriptor(typeof(IHandler<TMessage, TResponse>), typeof(THandler), lifetime)); services.Add(new ServiceDescriptor(typeof(IHandler<TMessage, TResponse>), typeof(THandler), lifetime));
services.AddInitializationScoped<HandlerInitialization<TMessage, TResponse, IHandler<TMessage, TResponse>>>(); services.AddInitializationScoped<HandlerInitialization<TMessage, TResponse, IHandler<TMessage, TResponse>>>();
services.AddInitialization<HandlerInitialization<TMessage, TResponse, IHandler<TMessage, TResponse>>>();
} }
return services; return services;
@@ -294,7 +312,7 @@ public static class IServiceCollectionExtensions
where TInitializationImplementation : class, IInitializationScoped where TInitializationImplementation : class, IInitializationScoped
{ {
services.Add(new ServiceDescriptor(typeof(IInitializationScoped), typeof(TInitializationImplementation), lifetime)); services.Add(new ServiceDescriptor(typeof(IInitializationScoped), typeof(TInitializationImplementation), lifetime));
services.AddTransient<IInitializationScoped>(provider => provider.GetRequiredService<IInitializationScoped>()); services.AddTransient(provider => provider.GetRequiredService<IInitializationScoped>());
return services; return services;
} }
@@ -50,6 +50,18 @@ public static class ContentTemplateBinding
{ {
cachedActivation = null; cachedActivation = null;
content.Unloaded -= HandleUnloaded; content.Unloaded -= HandleUnloaded;
content.DataContextChanged -= HandleDataContextChanged;
}
}
void HandleDataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args)
{
if (sender is FrameworkElement content)
{
if (content.DataContext is IActivation activation)
{
activation.IsActive = true;
}
} }
} }
@@ -57,11 +69,13 @@ public static class ContentTemplateBinding
{ {
content.Loaded += HandleLoaded; content.Loaded += HandleLoaded;
content.Unloaded += HandleUnloaded; content.Unloaded += HandleUnloaded;
content.DataContextChanged += HandleDataContextChanged;
} }
else else
{ {
content.Loaded -= HandleLoaded; content.Loaded -= HandleLoaded;
content.Unloaded -= HandleUnloaded; content.Unloaded -= HandleUnloaded;
content.DataContextChanged -= HandleDataContextChanged;
} }
} }
} }