9

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 の利用可能なすべてのインスタンスを探して、ファクトリの注入を強制することは可能ですか?

4

1 に答える 1

3

簡単な答え: いいえ。

あなたはコンストラクター注入のようなものを探していますが、これは明らかによりエレガントです。しかし、現状では、VSTO アドインの c'tor にアクセスできないため、ここではこれは不可能です。

とにかく、電話の何がそんなに悪いの_kernel.Get<IExpenseWorksheetFactory>ですか?結局のところ、依存関係を解決するために DI コンテナーを明示的に呼び出すことは、通常の使用例の 1 つであり、コード ビハインド ファイルはまさにそのために作成されています。

コード ビハインドにはビジネス ロジックを含めるべきではありませんが、その一方で、接続に必要なすべてのコードを確実に含める必要がありますそれが存在する主な理由です。または、言い換えれば:

コード ビハインド ファイル内のコードを避けることは、一般的に良い方法だと思います。

すべての場合に当てはまるわけではありません (ただし、大部分の場合に限られます)。ここで無理をしてはいけません。そうすることで、自分がシステムと戦っていることに気付くでしょう - そして覚えておいてください、システムは常に勝ちます ;-)...

于 2014-10-01T07:34:32.880 に答える