protected override void SetHandlingKernel( IKernelCommand command, KernelInvocationContext context) { if (context.HandlingKernel == null) { { switch (_childKernels.Count) { case 0: context.HandlingKernel = this; break; case 1: context.HandlingKernel = _childKernels[0]; break; default: if (command is SubmitCode submitCode && ChildKernels.SingleOrDefault(k => k.Name == submitCode.TargetKernelName) is {} targetKernel) { context.HandlingKernel = targetKernel; } else if (DefaultKernelName != null) { context.HandlingKernel = ChildKernels.SingleOrDefault(k => k.Name == DefaultKernelName); } break; }
protected override void SetHandlingKernel( IKernelCommand command, KernelInvocationContext context) { var targetKernelName = (command as KernelCommandBase)?.TargetKernelName ?? DefaultKernelName; if (context.HandlingKernel == null || context.HandlingKernel.Name != targetKernelName) { if (targetKernelName != null) { context.HandlingKernel = targetKernelName == Name ? this : ChildKernels.FirstOrDefault(k => k.Name == targetKernelName) ?? throw new NoSuitableKernelException(); } else { context.HandlingKernel = _childKernels.Count switch { 0 => this, 1 => _childKernels[0], _ => context.HandlingKernel }; } } }
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); var chooseKernelCommand = new Command($"%%{kernel.Name}"); chooseKernelCommand.Handler = CommandHandler.Create <KernelInvocationContext>(context => { context.HandlingKernel = kernel; }); AddDirective(chooseKernelCommand); RegisterForDisposal(kernel.KernelEvents.Subscribe(PublishEvent)); RegisterForDisposal(kernel); }
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); }