用于库的handeling配置的功能方式

时间:2018-01-21 18:13:12

标签: f# functional-programming

在C#中,库可能会暴露您使用DI容器提供的实现的接口,有什么功能方法呢?我想在库中设置一些可配置的东西('库范围内的')并且能够从主代码中设置。

1 个答案:

答案 0 :(得分:5)

你当然可以在F#中使用接口和DI容器。但是,函数式编程提供的其他方法也可能对您有用。一些选项可能是:

部分应用程序:模块中有一组函数,它们将配置信息作为第一个参数(例如,作为记录类型)。然后,您可以部分应用这些函数,仅传递配置,返回仅接受其余参数的函数。例如:

type Config =
    {
        ConnectionString: string
        SuperMode: bool
        NumberOfWidgets: int
    }

module Library =
    let login (config: Config) userName passwordHash =
        // do stuff
        ()

    let createWidget (config: Config) widgetName widgetValue =
        // do stuff
        ()

let config = {ConnectionString = "localhost"; SuperMode = true; NumberOfWidgets = 3}

let configuredLogin = Library.login config // configuredLogin is a function taking userName and passwordHash
let configuredCreateWidget = Library.createWidget config // configuredCreateWidget is a function taking widgetName and widgetValu

闭包:您有一个接受配置的函数,并返回一个或多个其他函数,这些函数关闭配置并在调用时使用它。例如:

let applyConfig (config: Config) =
    (fun userName passwordHash -> 
        Library.login config userName passwordHash), // do login using the config
    (fun widgetName widgetValue ->
        Library.createWidget config widgetName widgetValue) // create the widget using the config

let login, createWidget = applyConfig config // Returns functions that close over the Config and use it when called

选择最适合您需求的方式,并且不要使用您熟悉的经过验证的方法,因为它不具备功能性。