0

次のようなことは可能ですか?

var foos = Kernel.where(c=>c.module == myModule).GetAll<foo>;

そして、どのようにそれについて行くでしょうか?

If(!possible)
GetAll() メソッドを使用する場合、同じインターフェイスへのバインディングをどのように区別できますか? 、、および;
を認識しています。どちらを使用する必要があり、その理由は?WithParameterWithMetadataWithConstructorArgumentWithPropertyValue

乾杯


詳しくは

プラグイン フレームワークを作成しているので、これが必要です。ルーティング中に、プラグイン フレームワークは、どのコントローラーを参照するかを決定できる必要があります。プラグイン全体に複数のホーム コントローラーがある場合、期待どおりに動作しません。
コントローラ ファクトリが特定のプラグインのコントローラにリクエストを送信することを認識できるように、どのプラグインがどの IController 実装を登録したかを区別できるようにする必要があります。

4

3 に答える 3

0

簡単なアプローチは、インターフェースを定義することです。つまりIControllerProviderNameGetControllerメソッドがあります。コア製品は、スキャンされたすべてのIControllerProvider実装をロードし、コントローラーを取得して、名前とIcontrollerインスタンスをカーネルに登録します。このアプローチでは、プラグインは独自のコンテナーを使用することも、単に貧弱な人のDIを実行することもできます。その後、ルーティングハンドラーはを取得できIEnumerable<IController>ます。IControllerまたは、メタデータを挿入するためにフォールバックする必要がないように、名前をインターフェイスに配置する方がよいでしょう。

于 2012-11-22T06:03:20.777 に答える
0

それぞれにメタデータを添付することになりました:

Bind<IController>().To<MyController>()
   .Named(implementation.GetType().Name.Replace("Controller", string.Empty))
   .WithMetadata("Plugin", PluginName);`

次に、プラグインを次のようにルーティングします。

routes.MapRoute(
                name: "Plugin1",
                url: "Plugin1/{controller}/{action}/{id}",
                defaults: new { Plugin = PluginName, controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

そして、コントローラ ファクトリの GetControllerType メソッドで

object requestedModule;
if (requestContext.RouteData.Values.TryGetValue("Plugin", out requestedPlugin))
    controller = kernel.GetAll<IController>(c => c.Name == controllerName && c.Get<string>("module", string.Empty) == (string)requestedPlugin).SingleOrDefault();
于 2012-11-24T01:57:50.060 に答える
0

When() を使用することを検討したので、これを行う必要はありませんか?

すなわち

Bind<IInterface>().To<YourConcreteTypeOne>().When(r => r.Target.Name == "concreteObjectOne"); 

ここで受け入れられた解決策(更新されたセクション)で提案されているように。理想的には、バインディングを設定した後はカーネルにアクセスする必要はありません。そうしないと、DI フレームワークに密接に結合されます。これが当てはまらない場合は、質問を拡大してより多くのコードを含めてください。

于 2012-11-22T00:03:42.253 に答える