2017-01-22 7 views
0

私が知っている非常に具体的な質問ですが、より一般的にはBotFramework SDKのAutofacの使用にうまく適用されます。AutofacのIComponentContextはBotBuilderサンプルでどのように解決されますか?

'ContosoFlowers'サンプルでは、​​DialogFactoryクラスはその1つのコンストラクタパラメータとして、 'scope'メンバのAutofac IComponentContextを受け取ります。

しかし、私はこれがどこから来ているのか分からない。とにかくDIの不合理な憎しみがありますが、これを何らかの形で具体的な実装に結びつけるブートストラップ/サービスロケータ/モジュールなどはまだありません。明らかなモジュールはありません。 BotFrameworkコードのどこかで焼かれていますか?

また、このすべてを持っている目的が何であるか尋ねることができますDialogFactory.ContosoFlowersDialogFactory.Create()層ですか?たとえば、this.dialogFactory.Create<FlowerCategoriesDialog>()と呼んだ場合、これは私が想定しているのは、ダイアログを「新しくする」ことを避けることです。また、DIスコープが呼び出しダイアログで使用できないためです。その場合、なぜこのファクトリをRootDialogに注入し、IComponentContextスコープ自体に注入しないのですか?

noobの質問にはお詫び申し上げます(おそらく)。また、特定のBotFrameworkサンプルコードクエリのためのより良い場所/フォーラムがあるかどうかアドバイスしてください。ありがとう!

答えて

2

良い質問!私はそれらに対処してみましょう:

  1. IComponentContext。そのインターフェースの登録/ブートストラップはありません。それらはAutofacによって自動的に提供されます(hereを参照)。
  2. ContosoFlowersDialogFactory。あなたの仮定は正しいですが、ダイアログファクトリを持っているという考え方は、たとえば、単体テストのような制限を加えるため、「新しい」ダイアログを手作業で行うことを避けることです。確かに、提案しているアプローチは有効です。ダイアログでIComponentContextを使用することはできません(RootDialogだけでなく、SettingsDialogSavedAddressDialogなどの他のダイアログも使用してください)。そのレイヤーを持つ理由は主観的なものかもしれないので、私はここで私の考え方を提供するだけです。 IMOは、これらのレイヤーを持つことで、より洗練されたコードを作成し、アプリケーション全体でDIの特定のコンポーネントを使用することを防ぎます。このシナリオでは、DialogFactoryがDIレイヤーを処理します。必要に応じてDI機構を変更する。他のすべてのコンポーネントを更新する必要はありません。またはAutofacの変更が破損した場合でも、あなたは工場でそれを処理するだけです。私が選択しなければならないのであれば、直接のAutofac。*の依存関係をダイアログに持たないほうがいいでしょう。
+0

偉大な答え。ありがとう。オートファックは私が思ったよりも役に立つと分かりました:) 私は、この文脈でのインスタンシエーションへの工場のアプローチは主観的であると考えています。個人的には、あなたのアプリケーションでは、DIフレームワークを使用する価格として世界中で利用可能なオートファックの幽霊を犠牲にしているという見方があります。層。しかし、オプションがあるのは良いことです。 – oflahero

関連する問題