我有一个用 C# 编写的现有项目。我想将其部分业务逻辑移至 F#。 MyObjectX 是一个运行科学算法的 C# 类。 要运行 MyObjectX,它需要实现几个接口(interface),以及一些通过方法(而非构造函数)注入(inject)的依赖项。示例:
public class MyObjectX(): IMathSolver, IBusinessSolver
{
//private fields
private int operationMode;
private ISignalProvider signal;
//Inject dependcy via method
public void SetSignalProvider(ISignalProvider signal)
{
this.signal = signal;
}
//implemention of above interfaces
public double MethodMathSolver()
{
this.signal.GetThreshold();
//...
}
public double Method1BusinessSolver()
{
}
public double Method2MathSolver(IResultProvider provider)
{
var x = provider.GetValueAtTime(0.1);
//...
}
}
所以现在我想在 F# 中实现 MyObjectX。最好的方法是什么,这样我的代码才能尽可能发挥功能?
如果算法是在 F# 模块中实现的,则使现有的 C# MyObjectX 充当其余 C# 类和 F# 库之间的包装器/门面。
编写一个实现接口(interface)的 MyObjectX 类的 F# 类,并可能调用其他 F# 模块。
或者不是他们。请指教。
此外,将 C# 的依赖项传递给 F# 的最佳方式是什么,例如“IResultProvider/ISignalProvider”?我是否需要使用可变变量,这些变量将通过 F# 中的函数填充依赖项?
请指教。如果您能分享代码示例,我将不胜感激。
最佳答案
我认为您可以在 1 和 2 之间进行选择。这当然是最合理的两种方法。
我认为选项 2 可能更好,因为 F# 实现可以保留在简单的 F# 模块中,使用最惯用的 F# 样式(例如将函数作为参数传递)。惯用的 F# 代码在 C# 中并不总是易于使用,因此如果将其包装在实现所需 C# 接口(interface)的 F# 类中,则可以从 C# 代码中隐藏“F# 详细信息”,这很好。
看看:
F# Component Design Guidelines其中详细说明了如何以易于从 C# 使用的方式设计 F# 组件。
Interfaces (F#)在 MSDN 和 Interfaces page在 F# for Fun and Profit 了解有关如何在 F# 中实际编写此类接口(interface)实现的更多详细信息。
关于c# - 将 C# 接口(interface)/类传递给 F#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22543112/