Class 是否应该包装包含在类中具有副作用的值的类型提供程序?

Class 是否应该包装包含在类中具有副作用的值的类型提供程序?,class,f#,type-providers,side-effects,Class,F#,Type Providers,Side Effects,我试图在我的代码中实现F#coding conventions页面中的优秀建议 使用类来包含有副作用的值一节特别有趣。上面说 There are many times when initializing a value can have side effects, such as instantiating a context to a database or other remote resource. It is tempting to initialize such things in

我试图在我的代码中实现
F#coding conventions
页面中的优秀建议

使用类来包含有副作用的值一节特别有趣。上面说

There are many times when initializing a value can have side effects, such as instantiating a context to a database or other remote resource. It is tempting to initialize such things in a module and use it in subsequent functions.
并提供了一个例子。然后指出了这种做法的三个问题(由于篇幅不够,我省略了这些问题,但可以在链接的文章中看到),并建议使用一个简单的类来保存依赖项

我想知道应该如何对待类型提供者?例如,如果我有以下代码

[<Literal>]
let projDataPath = __SOURCE_DIRECTORY__ + @"\data\"

[<Literal>]
let configPath = projDataPath + "config.json"

type Cnfg = JsonProvider<Sample=configPath>
let config = Cnfg.Load(configPath)
[]
让projDataPath=\uuuuu源\uuuu目录\uuuuu+@“\data\”
[]
让configPath=projDataPath+“config.json”
类型Cnfg=JsonProvider
让config=Cnfg.Load(configPath)
使用类型提供程序初始化值会遇到与值初始化相关的问题,并会产生本文中描述的副作用


换句话说,我是否应该将类型提供程序包装在类中?

您通常不应该向使用者公开类型提供程序的实例或其提供的类型。除了非F#.NET使用者可能产生的潜在互操作性问题外,类型提供程序的实例通常表示与应用程序正在管理的某些私有状态或资源的接口。一般来说,最好从消费者那里提取底层资源,并提供最适合问题域的模型


链接文章特别警告不要将具有有限生命周期的类的实例捕获为模块中的绑定,因为绑定是不可变的,并且当实例的生命周期结束时,该实例将变得无效。这相当于在C#类中有一个
DbContext
或类似的实例作为
静态只读成员。它将由静态构造函数初始化,但永远不会更改,即使数据库连接关闭,并且
DbContext
实例不再有用。

谢谢。这就澄清了这一点。我还有另一个相关的问题,我将在稍后发布。