0

サービスをバインドし、アプリケーションで Ninject を使用してコンストラクター引数を指定しようとしています。コンストラクター引数は、クエリ文字列または Cookie から取得できる値です。現在持っているコードは次のようなものです

kernel.Bind<SomeService>()
      .ToSelf()
      .InRequestScope()
      .WithConstructorArgument("someID", ctx =>
           // Try to get it from the posted form values
           System.Web.HttpContext.Current.Request.Form["someID"] != null ? 
           long.Parse(System.Web.HttpContext.Current.Request.Form["someID"]) :                                          

           // Try to get it from the query string
           System.Web.HttpContext.Current.Request.QueryString["someID"] != null ?
           long.Parse(System.Web.HttpContext.Current.Request.QueryString["someID"]) 

           : 0);

これは機能しますが、かなり醜いです。Form 値または QueryString 値をパラメーターとして渡すなど、これを実現する他の方法があることは認識していますが、Binding で定義することを好みます。私たちが理想的にやりたいことは、次のようなものです。

   kernel.Bind<SomeService>()
          .ToSelf()
          .InRequestScope()
          .WithConstructorArgument("someID", ctx => GetSomeID());

私が言えることから、これは不可能です。コンストラクターの引数注入ロジックを別のメソッドに分割して、1 行の if ステートメントをネストする必要がないようにする別の方法はありますか?

4

1 に答える 1

1

インターフェイスを介してクエリ文字列/HTTPフォームへの依存関係をバインドすることをお勧めします。このアプローチは、依存性注入パターン (特定の実装とクラスからコードを切り離す) とより一致しているようです。

public interface IParameters
{
    string SomeID { get; }
}

public class ParametersFromHttpContext
{
    IQueryString _queryString;
    IRequestForm _requestForm;

    public ParametersFromHttpContext(IQueryString queryString, IRequestForm requestForm)
    {
        _queryString = queryString;
        _requestForm = requestForm;
    }

    public string SomeID
    {
        get
        {
            return
                // Try to get it from the posted form values
               _requestForm["someID"] != null ? 
               long.Parse(_requestForm["someID"]) :                                          

               // Try to get it from the query string
               _queryString["someID"] != null ?
               long.Parse(_queryString["someID"]) 

               : 0;
        }
    }
}

これで、カーネルで HttpContext を参照する必要なく、必要なロジックをバインディングに含めることができます。

kernel.Bind<IParameters>().To<ParametersFromHttpContext>();
于 2012-09-28T19:12:52.743 に答える