c# - 将 C# 接口(interface)/类传递给 F#

标签 c# dependency-injection f#

我有一个用 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。最好的方法是什么,这样我的代码才能尽可能发挥功能?

  1. 如果算法是在 F# 模块中实现的,则使现有的 C# MyObjectX 充当其余 C# 类和 F# 库之间的包装器/门面。

  2. 编写一个实现接口(interface)的 MyObjectX 类的 F# 类,并可能调用其他 F# 模块。

  3. 或者不是他们。请指教。

此外,将 C# 的依赖项传递给 F# 的最佳方式是什么,例如“IResultProvider/ISignalProvider”?我是否需要使用可变变量,这些变量将通过 F# 中的函数填充依赖项?

请指教。如果您能分享代码示例,我将不胜感激。

最佳答案

我认为您可以在 1 和 2 之间进行选择。这当然是最合理的两种方法。

我认为选项 2 可能更好,因为 F# 实现可以保留在简单的 F# 模块中,使用最惯用的 F# 样式(例如将函数作为参数传递)。惯用的 F# 代码在 C# 中并不总是易于使用,因此如果将其包装在实现所需 C# 接口(interface)的 F# 类中,则可以从 C# 代码中隐藏“F# 详细信息”,这很好。

看看:

关于c# - 将 C# 接口(interface)/类传递给 F#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22543112/

相关文章:

c# - 并行 forEach 搜索文件

c# - Microsoft azure 中的角色未记录到 WADLogsTable

c# - 我可以在 C# 中读取 Outlook (2003/2007) PST 文件吗?

c# - IoC 和 "hiding implementation details"

.net - 请求提交后无法执行此操作

algorithm - 红黑树包含过多的黑色节点和过少的红色节点

c# - Xamarin.Forms:Android <Entry> 和依赖服务?

symfony - 加载时snc_redis异常

dependency-injection - Angular2 DI - 在同一个构造函数中初始化多个不同的实例

f# - 如何匹配一个值的多个副本?