Как подцеплять сборки во время работы приложения?

У меня есть Configure метод, который запускается во время старта сервиса. Метод выглядит вот так:

public class ServicesConfiguration
    : IServicesConfiguration
{
    public void Configure(
        HostBuilderContext hostContext,
        IServiceCollection services )
    {
        services
            .AddArchiveClient()
            .AddSegmentStorageDepartmentServiceClient()
            .AddSegmentStorageSubjectServiceClient()
            .AddSegmentStorageTerritoryServiceClient()
            .AddSegmentStorageProductionCalendarServiceClient()
            .AddSegmentStorageWorktimeServiceClient()

            .AddSingleton<EventsNormalizerFactory>()
            .AddSingleton<DataSetGenerator>()

            .AddSingleton<IReportTemplate, ArbitraryPeriod.ReportTemplate>()
            .AddSingleton<IReportTemplate, LateForWork.ReportTemplate>()
            .AddSingleton<IReportTemplate, Monthly.ReportTemplate>()
            .AddSingleton<IReportTemplate, VariablePeriod.ReportTemplate>()
            .AddSingleton<IReportTemplate, Weekly.ReportTemplate>();
    }
}

Используется в другом классе, в другом методе, вот так:

public class ServicesConfiguration
    : IServicesConfiguration
{
    public void Configure(
        HostBuilderContext hostContext,
        IServiceCollection services )
    {
        LoadReportPlugins( hostContext, services );

        services
            .AddFileManagerClient()
            .AddHostedService<ReportsService>();
    }

    static private void LoadReportPlugins(
        HostBuilderContext hostContext,
        IServiceCollection services )
    {
        var reportFolderPath = Path.Combine(
            Path.GetDirectoryName( Assembly.GetExecutingAssembly().Location ),
            "plugins" );

        if ( Directory.Exists( reportFolderPath ).IsFalse() )
        {
            hostContext
                .RootLoggerGet()
                ?.Error(
                    "plugins directory does not exist at {filePath}",
                    reportFolderPath );

            return;
        }

        foreach ( var reportAssemblyFile in Directory.EnumerateFiles(
            path: reportFolderPath,
            searchPattern: "Report.*.dll",
            searchOption: SearchOption.AllDirectories ) )
            try
            {
                hostContext.PluginDirectoryPathsGet()
                    .Add( Path.GetDirectoryName( reportAssemblyFile ) );

                var reportAssembly = Assembly.LoadFrom( reportAssemblyFile );
                foreach ( var servicesConfigurationType in reportAssembly.GetTypes()
                    .Where( type => typeof( IServicesConfiguration ).IsAssignableFrom( type ) ) )
                    Activator.CreateInstance( servicesConfigurationType )
                        .As<IServicesConfiguration>()
                        .Configure( hostContext, services );
            }
            catch ( Exception ex )
            {
                hostContext
                    .RootLoggerGet()
                    ?.Error(
                        ex,
                        "exception loading {filePath}",
                        reportAssemblyFile );
            }
    }
}

Я могу написать новую dll, добавить зависимость и сделать ребилд - все, могу использовать логику этой dll Вопрос: можно ли все это сделать без ребилда приложения? Хочется просто подкинуть dll, оно само зарегистрировалось и я мог это использовать


Ответы (0 шт):