5

さまざまな領域を持つ ASP.NET MVC アプリケーションがあります。サービス層から同じ C# クラスを使用する 2 つの領域がありますが、異なる基になるデータを対象としています。これらのサービスは、ルート データの値に基づいて異なる依存関係を取得したいと考えています。

説明するのが難しいので、クラス/エリア名を言い換えています。説明する: 呼び出しロジック

「コード」がルート データにある場合、それが存在しないときに別の依存関係を注入したいと考えています。

条件付きバインディングを行うために使用できる .When() メソッドがあることは理解していますが、そこからルート データを取得する方法がわかりません。呼び出し元の領域に基づいて実行することもできますが、私の場合は好ましくありません (他の領域でコードを使用する可能性があると思います)。

これは可能ですか?

4

1 に答える 1

2

これは私にとってはうまくいきます(これは標準のルート構成用です"{controller}/{action}/{id}"

Ninject構成

protected override Ninject.IKernel CreateKernel()
{
    var kernel = new StandardKernel();
    kernel.Bind<IService>()
        .To<ServiceA>()
        .When(x => IsRouteValueDefined("id", null));
    kernel.Bind<IService>()
        .To<ServiceB>()
        .When(x => !IsRouteValueDefined("id",null));
    return kernel;
}
// just sample condition implementation
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() == routeValue;
}

使用します

  • ルートのServiceA:/ home / index / 1、/ home / index/2など。
  • ルートのServiceB:/、/ home/indexなど。
于 2012-12-04T14:58:19.283 に答える