2

NinjectModuleに、複数のアセンブリのすべてのインターフェイスのモックバインディングを設定するコードがあります。Ninject 2を使用すると、ラムダFrom()内でメソッドを複数回呼び出すことができました。Scan

Kernel.Scan(scanner =>
{
    string first = "MyAssembly";
    Assembly second = Assembly.Load("MyAssembly");
    scanner.From(first);
    scanner.From(second);
    scanner.BindWith<MockBindingGenerator>();
});

From()Ninject 3の新しい方法では、私が知る限り、連鎖呼び出しは許可されていません。これは私が思いつくことができる最高の同等物です:

string first = "MyAssembly";
Assembly second = Assembly.Load("MyAssembly");

Kernel.Bind(x => x
    .From(first)
    .SelectAllInterfaces()
    .BindWith<MockBindingGenerator>());

Kernel.Bind(x => x
    .From(second)
    .SelectAllInterfaces()
    .BindWith<MockBindingGenerator>());

上記のように、1つのアセンブリが複数回読み込まれると、新しいコードが壊れます*。firstsecond変数は異なるタイプであるため、これらを単純に1つの呼び出しに結合することはできません。私の実際の製品コードにも同じ問題がありますが、もちろん、同じアセンブリ名を2回ハードコーディングしているだけではありません。

From()では、上記を書き直して、複数の呼び出しを組み合わせて1回だけ呼び出すことができるようにするにはどうすればよいBindWith<>ですか?

編集

*バインディングコード自体は問題なく実行されます。例外は、2回バインドされたアセンブリに存在するインターフェイスのインスタンスを取得しようとすると発生します。

4

2 に答える 2

3

https://github.com/ninject/ninject.extensions.conventions/wiki/OverviewJoinの下部にある構文を見ましたか? 私はそれがあなたが求めているものだと想像します...

(おまけとして: ドキュメントを見ても飛び出さなかった場合は、新しい Wiki ページに分割するのが最善だと思うのか、それとも他のアイデアがあるのか​​ 提案できますか? 単にそれを使用している場合IntelliSense から、より簡単に発見できる方法を提案できますか?

.Join編集: 熟考すると、ビットを実行するまでは利用可能にならないという事実のために、あなたはそれを見なかったと思います.Select...。(ちなみに、これに対する私の関心は、私が wiki で編集を行ったという事実によって引き起こされます。この出会いから学んだことは、そこでも自由に編集してください。))

于 2012-03-28T20:11:07.660 に答える
2

すべてのアセンブリ名のリストを作成して問題を解決しました。

string first = "MyAssembly";                    // .From("MyAssembly")
Assembly second = Assembly.Load("MyAssembly");  // .From(Assembly.Load("MyAssembly"))
Type third = typeof(Foo);                       // .FromAssemblyContaining<Foo>

Kernel.Bind(x => x
    .From(new [] { first, second.FullName, third.Assembly.FullName })
    .SelectAllInterfaces()
    .BindWith<MockBindingGenerator>());
于 2012-03-28T18:41:28.167 に答える