public CompositeKernel() { Name = nameof(CompositeKernel); _extensionLoader = new CompositeKernelExtensionLoader(); Pipeline.AddMiddleware(async(command, context, next) => { if (command is AddPackage _) { var packageAddedEvents = new List <PackageAdded>(); using var _ = context.KernelEvents.OfType <PackageAdded>().Subscribe(packageAddedEvents.Add); await next(command, context); foreach (var packageRoot in packageAddedEvents.Select(p => p.PackageReference.PackageRoot) .Distinct()) { var loadExtensionsInDirectory = new LoadExtensionsInDirectory(packageRoot, Name); await this.SendAsync(loadExtensionsInDirectory); } } else { await next(command, context); } }); }
public void Add(IKernel kernel) { if (kernel == null) { throw new ArgumentNullException(nameof(kernel)); } if (ChildKernels.Any(k => k.Name == kernel.Name)) { throw new ArgumentException($"Kernel \"{kernel.Name}\" already registered", nameof(kernel)); } _childKernels.Add(kernel); if (kernel is KernelBase kernelBase) { kernelBase.Pipeline.AddMiddleware(async(command, context, next) => { await next(command, context); while (_packages.TryDequeue(out var packageAdded)) { var loadExtensionsInDirectory = new LoadExtensionsInDirectory(packageAdded.PackageReference.PackageRoot, Name); await this.SendAsync(loadExtensionsInDirectory); } }); } var chooseKernelCommand = new Command($"%%{kernel.Name}") { Handler = CommandHandler.Create <KernelInvocationContext>( context => { context.HandlingKernel = kernel; }) }; AddDirective(chooseKernelCommand); RegisterForDisposal(kernel.KernelEvents.Subscribe(PublishEvent)); RegisterForDisposal(kernel); }
private void AddDirectiveMiddlewareAndCommonCommandHandlers() { Pipeline.AddMiddleware( (command, context, next) => command switch { SubmitCode submitCode => HandleDirectivesAndSubmitCode( submitCode, context, next), LoadExtension loadExtension => HandleLoadExtension( loadExtension, context, next), DisplayValue displayValue => HandleDisplayValue( displayValue, context, next), UpdateDisplayedValue updateDisplayValue => HandleUpdateDisplayValue( updateDisplayValue, context, next), LoadExtensionsInDirectory loadExtensionsInDirectory => HandleLoadExtensionsInDirectory( loadExtensionsInDirectory, context, next), _ => next(command, context) });