在C#中,库可能会暴露您使用DI容器提供的实现的接口,有什么功能方法呢?我想在库中设置一些可配置的东西('库范围内的')并且能够从主代码中设置。
答案 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
选择最适合您需求的方式,并且不要使用您熟悉的经过验证的方法,因为它不具备功能性。