为了给出一些上下文,我试图将现有的c#应用程序与React SPA连接起来。问题是,c#代码包含一些非常困难的数学计算,我无法重写它。
我的想法是构建一个Blazor WebAssembly应用程序,它包含了现有的代码库。
在无数个小时尝试了几种不同的解决方案之后,我发现,可以复制Blazor的"框架"。文件夹(通过构建项目生成)放入我的React公共文件夹。这允许我从JavaScript代码中调用静态c#方法。到目前为止都很好,但不幸的是不能调用非静态方法。
根据这篇文章,应该可以通过IJSRuntime发送c#实例,但这并不适用于我的情况。从我的角度来看,看起来IJSRuntime没有被注入,因为JavaScript代码不是Blazor的一部分。
有人知道如何注入IJSRuntime与React环境的任何解决方案吗?或者有没有更好的解决方案从React应用程序调用c#代码?
为什么不使用一个简单的REST API来代替所有这些东西呢?您可以简单地实现一个接受参数(通过HTTP)并返回结果的端点。在大多数情况下,这比其他可能的方法更容易设置和维护。
简单地添加:
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
然后创建你的控制器,它接受构造函数中的非静态服务(通过依赖注入)来进行计算,并返回值:
[ApiController]
class MathController : ControllerBase
{
private readonly MyCalculatorService calculator;
MathController(MyCalculatorService calculator) {
this.calculator = calculator;
}
[HttpPost("api/math/my-math")]
public async Task<ActionResult<MathResult>> MyMathEndpoint([FromBody] MathInput mathInput) {
var result = calculator.GetResult(mathInput);
return new JsonResult(result);
}
}
MathInput
和MathResult
只是例子,但你实际上可以使用任何东西。