bugfix> class > 投稿

私は自分のコードに F# coding conventions の優れたアドバイスを実装しようとしていますページ

https://docs.microsoft.com/en-us/dotnet/fsharp/style-guide/conventions。

セクション Use classes to contain values that have side effects 特に興味深いです。それは言います

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.

例を示します。次に、このプラクティスに関する3つの問題を指摘し(スペース不足のためにそれらを省略していますが、リンクされた記事で見ることができます)、依存関係を保持するために単純なクラスを使用することをお勧めします。

型プロバイダーはどのように扱われるべきだろうか?たとえば、次のコードがある場合、

[<Literal>]
let projDataPath = __SOURCE_DIRECTORY__ + @"\data\"
[<Literal>]
let configPath = projDataPath + "config.json"
type Cnfg = JsonProvider<Sample=configPath>
let config = Cnfg.Load(configPath)

型プロバイダーを使用して値を初期化すると、記事で説明されている副作用を伴う値の初期化に関連する問題が発生しますか?

つまり、型プロバイダーをクラス内にラップする必要がありますか?

回答 1 件
  • 通常、型プロバイダーのインスタンスまたは提供された型をコンシューマーに公開しないでください。 F#以外の.NETコンシューマーから生じる可能性のある潜在的な相互運用性の問題は別として、タイププロバイダーのインスタンスは、多くの場合、アプリケーションが管理しているプラ​​イベート状態またはリソースへのインターフェイスを表します。一般的なルールとして、基礎となるリソースを消費者から抽象化し、問題の領域に最適なモデルを提示することが最善です。

    バインドは不変であり、そのライフサイクルが終了するとインスタンスが無効になるため、リンクされた記事は、モジュール内のバインディングとして有限のライフサイクルを持つクラスのインスタンスをキャプチャすることに対して特に警告を発します。これは、 DbContext を持つことに相当します  または static readonly としての同様のインスタンス  C#クラスのメンバー。静的コンストラクターによって初期化されますが、データベース接続が閉じられて DbContext  インスタンスはもはや有用ではありません。

あなたの答え