TelegramBotFramework/TelegramBotBase/Factories/ServiceProviderStartFormFactory.cs
Максим Човнюк 6a80ec66ad
All checks were successful
build nuget workflow for TelegramBotBase project / Build-TelegramBotBase (x64, linux) (push) Successful in 37s
di and serialization support
2024-12-06 16:13:46 +05:00

54 lines
1.6 KiB
C#

using System;
using Microsoft.Extensions.DependencyInjection;
using TelegramBotBase.DependencyInjection;
using TelegramBotBase.Exceptions;
using TelegramBotBase.Form;
using TelegramBotBase.Interfaces;
namespace TelegramBotBase.Factories;
public class ServiceProviderStartFormFactory : IStartFormFactory
{
private readonly IServiceProvider _serviceProvider;
private readonly Type _startFormClass;
public ServiceProviderStartFormFactory(Type startFormClass, IServiceProvider serviceProvider)
{
if (!typeof(FormBase).IsAssignableFrom(startFormClass))
{
throw new ArgumentException($"{nameof(startFormClass)} argument must be a {nameof(FormBase)} type");
}
_startFormClass = startFormClass;
_serviceProvider = serviceProvider;
}
public FormBase CreateForm() => CreateForm(null);
public FormBase CreateForm(Type? specifiedStartFrom = null)
{
FormBase fb = null;
try
{
fb = (FormBase)ActivatorUtilities.CreateInstance(_serviceProvider, specifiedStartFrom ?? _startFormClass);
}
catch(InvalidOperationException ex)
{
throw new InvalidServiceProviderConfiguration(ex.Message, ex);
}
//Sets an internal field for future ServiceProvider navigation
fb.SetServiceProvider(_serviceProvider);
return fb;
}
}
public class ServiceProviderStartFormFactory<T> : ServiceProviderStartFormFactory
where T : FormBase
{
public ServiceProviderStartFormFactory(IServiceProvider serviceProvider) : base(typeof(T), serviceProvider)
{
}
}