この長い質問で申し訳ありませんが、具体的な回答がない可能性があるものを求めているため、wiki にフラグが付けられています。閉まっていればそのまま。
私の主な質問はこれです:
基本クラスで完全に定義されていない流暢なインターフェイスを作成して、流暢なインターフェイスを使用するプログラムが既存の構造内の新しい単語を追加し、ガイド インターフェイスを維持して、ドットの後にインテリセンスこの時点で実際に適用されるキーワードのみをリストします。
IoC コンテナの書き換えを 3 回繰り返しています。2 回目の繰り返しはパフォーマンスの改善でした。この 3 回目の繰り返しは、いくつかの拡張性の問題と分離の問題を解決することです。
基本的に、拡張性の問題は何もないことです。私は最近、有効期間のあるサービスを使用したいと考えていました。有効期限が切れた後、新しいコピーを解決します。たとえば、構成ファイルを 1 分ごとに読み取りますが、それ以上の頻度ではありません。これは現在の IoC ソリューションではサポートされていませんでしたが、追加する唯一の方法は、基本クラス ライブラリにアクセスして、そこにサポートを追加することでした。これは、拡張可能なクラス ライブラリの構築に失敗したことを意味します。公平を期すために、私はそれに拡張性を組み込むつもりはありませんでしたが、後でこのようなものを追加するのがどれほど苦痛になるかを十分に理解していませんでした.
私は構成用の流暢なインターフェイスを見ています。インターフェイスにも完全な拡張性を組み込みたい (またはそれを取り除きたいので、やりたくない) ため、別の方法で行う必要があります。
そういうわけで、私はあなたの意見が必要です。流暢なインターフェイスを実際に使用した経験はほとんどありませんが、それらを使用するかなりの数のコードを見てきました。そのため、すぐに使用できる明らかな利点が 1 つあります。
- 通常、流暢なインターフェースを使用するコードは非常に読みやすい
言い換えれば、これは:
ServiceContainer.Register<ISomeService>()
.From.ConcreteType<SomeService>()
.For.Policy("DEBUG")
.With.Scope.Container()
.And.With.Parameters
.Add<String>("connectionString", "Provider=....")
.Add<Boolean>("optimizeSql", true);
これよりも読みやすいです:
ServiceContainer.Register(typeof(ISomeService), typeof(SomeService),
"DEBUG", ServiceScope.Container, new Object[] { "Provider=...", true });
したがって、読みやすさは 1 つの問題です。
ただし、プログラマーのガイダンスは別のものであり、Web またはエディターで既存のコードを読んでも簡単には理解できないものです。
基本的に、これを入力すると:
ServiceContainer.Register<ISomeService>()
.From.|
^-cursor here
すると、Intellisense が利用可能な解像度の種類を表示します。それを選んだら、次のように書きます。
ServiceContainer.Register<ISomeService>()
.From.ConcreteType<SomeService>()
.For.|
次に、「ポリシー」などの「For」キーワードの後にのみ利用可能なものを取得します。
しかし、これは大きな問題ですか?あなたが使用した流暢なインターフェースはこのようなものでしたか? インターフェイスを定義するための明白な対処法は、すべてのキーワードとすべてを含むクラスまたはインターフェイスを作成して、各コンマの後のインテリセンスにすべてが含まれるようにすることですが、これにより、これが合法になる可能性もあります (たとえば、コンパイル) コード:
ServiceContainer.Register<ISomeService>()
.From.ConcreteType<SomeService>()
.From.Delegate(() => new SomeService())
.From.With.For.Policy("Test");
そのため、サービスを解決する方法を指定した後は、それを再度行うことができないように流暢なインターフェイスを構築したいと思います。
- 言い換えれば、流暢なインターフェイスは非常に使いやすく、何ができるかをガイドしてくれます。
しかし、これは典型的なものですか?リゾルバーのタイプ (ConcreteType、Delegate など)、スコープのタイプ (Factory、Container、Singleton、Cache など) などのこれらのキーワードを拡張メソッドとして追加できるようにしたいので、プログラムは、基本クラスにアクセスして変更することなく、これを行う独自の方法を定義できます。つまり、すべての中間ストップにインターフェイスを提供し、実際の重要なキーワードをそのままにしておく必要があります。これらのキーワードの実装は、必要に応じて、返す中間停止インターフェイスを 1 つ選択する必要があります。
したがって、次のインターフェイスを定義する必要があるようです。
- xyz.From.
xyz.From.<Resolver here>.
<Resolver here>.With.
<Resolver here>.For.
などですが、それは私には断片的に見えます。
流暢なインターフェイスの経験がある人は、戻って、引用された回答を上部近くで読んで、簡単な回答をしてもらえますか?