3

ASP.NETMVCコントローラーにサービスを挿入するという異常な状況が発生しました。コントローラは、ページにサイドバーメニューを表示するための単一のアクションを提供し、コントローラに注入されるサービスは、サイドバーコンテンツを作成するためのファクトリです。アクションは[ChildActionOnly]属性で装飾されています。サイドバーは、別のアクションをレンダリングするときにのみレンダリングできます。

難しいのは、要求されているページ(=コントローラー)に応じて、サイドバーファクトリ抽象化のさまざまなインスタンスを挿入したいということです。以前は、ある種の抽象ファクトリを使用してこれを行っていました。これには、使用する具体的なファクトリ実装を決定するためにコントローラ名文字列を使用するというエレガントでない実装がありました。これを適切な抽象ファクトリに移動したので、ファクトリタイプの選択を別の場所に移動する必要があります。

私のNinjectバインディングは現在、非常に単純に次のように定義されています。

Kernel.Bind<ISideBarFactory>().To<FooSideBarFactory>().InRequestScope();
Kernel.Bind<ISideBarFactory>().To<DefaultSideBarFactory>().InRequestScope();

さらにコントローラーを追加すると、最初の行のインスタンスがさらに追加されます。私がこれが機能することを望んでいる方法は次のとおりです。

  • /foo/actionリクエストを受け取りました
    • NinjectはにバインドISideBarFactoryFooSideBarFactory、に注入しますSideBarController
  • /bar/actionリクエストを受け取りました
    • NinjectはにバインドISideBarFactoryBarSideBarFactory、に注入しますSideBarController
  • /baz/actionリクエストを受け取りました
    • 存在しないBazSideBarFactoryため、NinjectはISideBarFactoryデフォルトの実装にバインドし、DefaultSideBarFactoryに注入しますSideBarController

ContextualBindingに関するNinjectwikiページを調べましたが、これは原則として私が望んでいるように見えますが、明らかに私の目標を達成する文書は見つかりませんでした。

4

1 に答える 1

3

ルートデータの読み取りとContextual-Bindingを組み合わせることができます

バインディング

// default binding - used if none of the conditions is met
kernel.Bind<IService>()
    .To<DefaultService>()

kernel.Bind<IService>()
    .To<BasicService>()
    .When(x=> IsRouteValueDefined("controller", "Service"));

kernel.Bind<IService>()
    .To<ExtraService>()
    .When(x=> IsRouteValueDefined("controller", "ExtraService"));

IsRouteValueDefined()方法

ルートキーが定義され、指定されたrouteValueルートキーのルート値と等しいか、である場合にtrueを返しますnull

public static bool IsRouteValueDefined(string routeKey, string routeValue)
{
    var mvcHanlder = (MvcHandler)HttpContext.Current.Handler;
    var routeValues = mvcHanlder.RequestContext.RouteData.Values;
    var containsRouteKey = routeValues.ContainsKey(routeKey);
    if (routeValue == null)
        return containsRouteKey;
    return containsRouteKey && routeValues[routeKey].ToString().ToUpper() == routeValue.ToUpper();
}
于 2013-02-12T08:03:30.360 に答える