Как подцеплять сборки во время работы приложения?
У меня есть 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, оно само зарегистрировалось и я мог это использовать