Ninject调用方法返回构造函数参数

时间:2012-09-28 18:23:06

标签: asp.net-mvc ninject

我正在尝试绑定服务并在我们的应用程序中使用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());

据我所知,这是不可能的。是否有另一种方法可以将构造函数参数注入逻辑分解为另一种方法,因此我们不必嵌套一行if语句?

1 个答案:

答案 0 :(得分: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>();