Excel VSTO プロジェクトの DI を構成しようとしています。
特定のワークシートに対して生成されたコード ビハインドは、Startup というイベントを提供します。このイベントは、Startup、Change、BeforeDoubleClick などのイベントのイベント ハンドラーを設定します。
コード ビハインド ファイル内のコードを避けることは、一般的に良い方法だと思います。
私がしているのは、ワークシートを操作し、Web サービス、データベース、ドメイン ロジックなどの外部コードを呼び出す外部クラスを作成することです。
コードビハインド ファイルによって使用される Factory を正常に作成し、ワークシート ロジック クラスをインスタンス化できます。
例えば:
//...inside Sheet1.cs
private IExpenseWorksheetFactory _factory;
void ExpensesBeforeRightClick(Excel.Range target, ref bool cancel)
{
Application.EnableEvents = false;
var popup = _factory.CreateContextMenu();
popup.ShowContextMenu(target, ref cancel);
Application.EnableEvents = true;
}
// ... rest of Sheet1.cs
上記のコードは、Visual Studio が生成するコード ビハインド ファイル内にあり、最小限のものです。ポップアップを表示する責任は、個別のオブジェクトに委任されます。ファクトリ オブジェクトは、Ninject と対話してオブジェクトを取得する責任があります。このプロキシは、次のようなインターフェイスを渡すと、Ninject.Extensions.Factory プロジェクトを使用して自動的に生成されます。
/// <summary>
/// Abstract Factory for creating Worksheet logic objects. Meant to be used with Ninject Factory extension.
/// </summary>
public interface IExpenseWorksheetFactory
{
ExpenseWorksheet CreateWorksheet();
ExpenseWorksheet.ContextMenus CreateContextMenu();
ExpenseWorksheet.Events CreateEventHandlers();
}
アプリケーションの起動時に、バインディングとファクトリ自体のバインディングを定義しました。
//instantiate the kernel in app's Composition Root
_kernel = new StandardKernel();
//worksheet related stuff - seems to be ok to be singleton
_kernel.Bind<ExpenseWorksheet>().ToSelf().InSingletonScope();
_kernel.Bind<ExpenseWorksheet.Events>().ToSelf().InSingletonScope();
_kernel.Bind<ExpenseWorksheet.ContextMenus>().ToSelf().InSingletonScope();
//"automagic" factories
_kernel.Bind<IExpenseWorksheetFactory>().ToFactory();
問題は:
このファクトリを VSTO ワークシートの生成コードに挿入するにはどうすればよいですか? _kernel.Get<IExpenseWorksheetFactory>
ワークシートの Startup メソッド内で呼び出すという考えは好きではありません。Sheet1 の利用可能なすべてのインスタンスを探して、ファクトリの注入を強制することは可能ですか?